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#include <stdarg.h>
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org#include "src/ast-value-factory.h"
105de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/platform.h"
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/prettyprinter.h"
12196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/scopes.h"
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
1571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
196d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgPrettyPrinter::PrettyPrinter(Zone* zone) {
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  output_ = NULL;
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  size_ = 0;
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  pos_ = 0;
236d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  InitializeAstVisitor(zone);
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPrettyPrinter::~PrettyPrinter() {
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  DeleteArray(output_);
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitBlock(Block* node) {
3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!node->is_initializer_block()) Print("{ ");
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintStatements(node->statements());
3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->statements()->length() > 0) Print(" ");
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!node->is_initializer_block()) Print("}");
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid PrettyPrinter::VisitVariableDeclaration(VariableDeclaration* node) {
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("var ");
4243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteral(node->proxy()->name(), false);
43812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print(";");
44812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
45812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
46812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
47812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgvoid PrettyPrinter::VisitFunctionDeclaration(FunctionDeclaration* node) {
48812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print("function ");
49812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteral(node->proxy()->name(), false);
50812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print(" = ");
51812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintFunctionLiteral(node->fun());
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(";");
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid PrettyPrinter::VisitModuleDeclaration(ModuleDeclaration* node) {
5778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Print("module ");
5878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  PrintLiteral(node->proxy()->name(), false);
5978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Print(" = ");
6078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Visit(node->module());
6178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Print(";");
6278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
6378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
6478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
65812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgvoid PrettyPrinter::VisitImportDeclaration(ImportDeclaration* node) {
66812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print("import ");
67812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteral(node->proxy()->name(), false);
68812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print(" from ");
69812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Visit(node->module());
70812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print(";");
71812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
72812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
73812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
74812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgvoid PrettyPrinter::VisitExportDeclaration(ExportDeclaration* node) {
75812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print("export ");
76812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteral(node->proxy()->name(), false);
77812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print(";");
78812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
79812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
80812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
8178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid PrettyPrinter::VisitModuleLiteral(ModuleLiteral* node) {
8278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  VisitBlock(node->body());
8378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
8478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
8578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
8678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid PrettyPrinter::VisitModuleVariable(ModuleVariable* node) {
87f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  Visit(node->proxy());
8878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
8978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
9078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
9178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid PrettyPrinter::VisitModulePath(ModulePath* node) {
9278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Visit(node->module());
9378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Print(".");
9478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  PrintLiteral(node->name(), false);
9578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
9678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
9778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
9878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid PrettyPrinter::VisitModuleUrl(ModuleUrl* node) {
9978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Print("at ");
10078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  PrintLiteral(node->url(), true);
10178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
10278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
10378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
1048e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid PrettyPrinter::VisitModuleStatement(ModuleStatement* node) {
1058e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  Print("module ");
1068e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  PrintLiteral(node->proxy()->name(), false);
1078e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  Print(" ");
1088e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  Visit(node->body());
1098e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}
1108e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
1118e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitExpressionStatement(ExpressionStatement* node) {
11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(";");
11543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
11643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitEmptyStatement(EmptyStatement* node) {
11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(";");
12043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitIfStatement(IfStatement* node) {
12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("if (");
12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->condition());
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(") ");
12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->then_statement());
12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->HasElseStatement()) {
12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print(" else ");
13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(node->else_statement());
13143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitContinueStatement(ContinueStatement* node) {
13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("continue");
13708e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  ZoneList<const AstRawString*>* labels = node->target()->labels();
13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (labels != NULL) {
13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print(" ");
140e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(labels->length() > 0);  // guaranteed to have at least one entry
14143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintLiteral(labels->at(0), false);  // any label from the list is fine
14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(";");
14443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitBreakStatement(BreakStatement* node) {
14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("break");
14908e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  ZoneList<const AstRawString*>* labels = node->target()->labels();
15043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (labels != NULL) {
15143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print(" ");
152e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(labels->length() > 0);  // guaranteed to have at least one entry
15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintLiteral(labels->at(0), false);  // any label from the list is fine
15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(";");
15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
15743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitReturnStatement(ReturnStatement* node) {
16043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("return ");
16143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
16243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(";");
16343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1664acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.orgvoid PrettyPrinter::VisitWithStatement(WithStatement* node) {
1674acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  Print("with (");
16843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
16943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(") ");
1704acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  Visit(node->statement());
17143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
17243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitSwitchStatement(SwitchStatement* node) {
17543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLabels(node->labels());
17643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("switch (");
17743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->tag());
17843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(") { ");
17943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ZoneList<CaseClause*>* cases = node->cases();
18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < cases->length(); i++)
181a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    Visit(cases->at(i));
18243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("}");
18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
18443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
186a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgvoid PrettyPrinter::VisitCaseClause(CaseClause* clause) {
187a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (clause->is_default()) {
188a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    Print("default");
189a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  } else {
190a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    Print("case ");
191a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    Visit(clause->label());
192a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  }
193a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  Print(": ");
194a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  PrintStatements(clause->statements());
195a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (clause->statements()->length() > 0)
196a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    Print(" ");
197a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
198a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
199a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
2009d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid PrettyPrinter::VisitDoWhileStatement(DoWhileStatement* node) {
20143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLabels(node->labels());
2029d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print("do ");
2039d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Visit(node->body());
2049d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print(" while (");
2059d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Visit(node->cond());
2069d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print(");");
2079d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com}
20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2109d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid PrettyPrinter::VisitWhileStatement(WhileStatement* node) {
2119d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  PrintLabels(node->labels());
2129d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print("while (");
2139d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Visit(node->cond());
2149d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print(") ");
2159d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Visit(node->body());
2169d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com}
2179d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
2189d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
2199d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid PrettyPrinter::VisitForStatement(ForStatement* node) {
2209d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  PrintLabels(node->labels());
2219d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print("for (");
2229d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  if (node->init() != NULL) {
2239d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    Visit(node->init());
2249d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    Print(" ");
2259d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  } else {
2269d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    Print("; ");
2279d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
2289d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  if (node->cond() != NULL) Visit(node->cond());
2299d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print("; ");
2309d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  if (node->next() != NULL) {
2319d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    Visit(node->next());  // prints extra ';', unfortunately
2329d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    // to fix: should use Expression for next
23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
2349d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print(") ");
2359d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Visit(node->body());
23643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
23743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitForInStatement(ForInStatement* node) {
24043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLabels(node->labels());
24143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("for (");
24243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->each());
24343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" in ");
24443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->enumerable());
24543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(") ");
24643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->body());
24743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
24843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
24943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2501fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgvoid PrettyPrinter::VisitForOfStatement(ForOfStatement* node) {
2511fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  PrintLabels(node->labels());
2521fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Print("for (");
2531fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Visit(node->each());
2541fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Print(" of ");
2551fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Visit(node->iterable());
2561fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Print(") ");
2571fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Visit(node->body());
2581fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}
2591fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
2601fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
2619d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid PrettyPrinter::VisitTryCatchStatement(TryCatchStatement* node) {
26243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("try ");
26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->try_block());
26443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" catch (");
2656d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  const bool quote = false;
2664f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  PrintLiteral(node->variable()->name(), quote);
26743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(") ");
26843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->catch_block());
26943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
27043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
27143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2729d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid PrettyPrinter::VisitTryFinallyStatement(TryFinallyStatement* node) {
27343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("try ");
27443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->try_block());
27543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" finally ");
27643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->finally_block());
27743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
27843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
27943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitDebuggerStatement(DebuggerStatement* node) {
28143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("debugger ");
28243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
28343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitFunctionLiteral(FunctionLiteral* node) {
28643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("(");
28743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintFunctionLiteral(node);
28843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
28943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
29043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
292a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgvoid PrettyPrinter::VisitClassLiteral(ClassLiteral* node) {
293a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Print("(class ");
294a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  PrintLiteral(node->name(), false);
295a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  if (node->extends()) {
296a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    Print(" extends ");
297a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    Visit(node->extends());
298a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  }
299a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Print(" { ");
300a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  for (int i = 0; i < node->properties()->length(); i++) {
301a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    PrintObjectLiteralProperty(node->properties()->at(i));
302a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  }
303a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Print(" })");
304a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org}
305a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
306a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
307fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.orgvoid PrettyPrinter::VisitNativeFunctionLiteral(NativeFunctionLiteral* node) {
30843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("(");
309fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  PrintLiteral(node->name(), false);
31043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
31143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitConditional(Conditional* node) {
31543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->condition());
31643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" ? ");
31743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->then_expression());
31843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" : ");
31943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->else_expression());
32043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
32143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitLiteral(Literal* node) {
3241510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  PrintLiteral(node->value(), true);
32543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
32643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitRegExpLiteral(RegExpLiteral* node) {
32943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" RegExp(");
33043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteral(node->pattern(), false);
33143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(",");
33243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteral(node->flags(), false);
33343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(") ");
33443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
33543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitObjectLiteral(ObjectLiteral* node) {
33843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("{ ");
33943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < node->properties()->length(); i++) {
34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (i != 0) Print(",");
341a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    PrintObjectLiteralProperty(node->properties()->at(i));
34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
34343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" }");
34443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
34543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
347a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgvoid PrettyPrinter::PrintObjectLiteralProperty(
348a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    ObjectLiteralProperty* property) {
349a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  // TODO(arv): Better printing of methods etc.
350a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Print(" ");
351a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Visit(property->key());
352a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Print(": ");
353a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Visit(property->value());
354a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org}
355a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
356a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
35743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitArrayLiteral(ArrayLiteral* node) {
35843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("[ ");
35943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < node->values()->length(); i++) {
36043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (i != 0) Print(",");
36143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(node->values()->at(i));
36243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
36343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" ]");
36443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
36543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitVariableProxy(VariableProxy* node) {
36843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteral(node->name(), false);
36943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
37043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitAssignment(Assignment* node) {
37343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->target());
37443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" %s ", Token::String(node->op()));
37543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->value());
37643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
37743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
37843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
379f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvoid PrettyPrinter::VisitYield(Yield* node) {
380f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  Print("yield ");
381f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  Visit(node->expression());
382f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
383f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
384f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
38543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitThrow(Throw* node) {
38643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("throw ");
38743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->exception());
38843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
38943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitProperty(Property* node) {
39243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* key = node->key();
39343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Literal* literal = key->AsLiteral();
3941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (literal != NULL && literal->value()->IsInternalizedString()) {
39543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("(");
39643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(node->obj());
39743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print(").");
3981510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    PrintLiteral(literal->value(), false);
39943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
40043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(node->obj());
40143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("[");
40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(key);
40343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("]");
40443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
40643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitCall(Call* node) {
40943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
41043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintArguments(node->arguments());
41143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
41243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitCallNew(CallNew* node) {
41543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("new (");
41643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
41743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
41843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintArguments(node->arguments());
41943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitCallRuntime(CallRuntime* node) {
42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("%%");
42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteral(node->name(), false);
42543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintArguments(node->arguments());
42643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
42743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitUnaryOperation(UnaryOperation* node) {
43040cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org  Token::Value op = node->op();
43140cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org  bool needsSpace =
43240cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org      op == Token::DELETE || op == Token::TYPEOF || op == Token::VOID;
43340cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org  Print("(%s%s", Token::String(op), needsSpace ? " " : "");
43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
43543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
43643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
43743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitCountOperation(CountOperation* node) {
44043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("(");
44143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->is_prefix()) Print("%s", Token::String(node->op()));
44243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
44343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->is_postfix()) Print("%s", Token::String(node->op()));
44443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
44543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
44643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitBinaryOperation(BinaryOperation* node) {
44943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("(");
45043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->left());
45140cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org  Print(" %s ", Token::String(node->op()));
45243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->right());
45343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
45443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
45543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitCompareOperation(CompareOperation* node) {
45843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("(");
45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->left());
46040cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org  Print(" %s ", Token::String(node->op()));
46143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->right());
46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
46343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
46443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
46543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
46643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitThisFunction(ThisFunction* node) {
46743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("<this-function>");
46843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
46943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
47043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgvoid PrettyPrinter::VisitSuperReference(SuperReference* node) {
4725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  Print("<super-reference>");
4735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
4745e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4755e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4760b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgconst char* PrettyPrinter::Print(AstNode* node) {
47743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Init();
47843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node);
47943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return output_;
48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
48343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst char* PrettyPrinter::PrintExpression(FunctionLiteral* program) {
48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Init();
48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ExpressionStatement* statement =
48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    program->body()->at(0)->AsExpressionStatement();
48743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(statement->expression());
48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return output_;
48943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
49043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst char* PrettyPrinter::PrintProgram(FunctionLiteral* program) {
49343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Init();
49443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintStatements(program->body());
49543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("\n");
49643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return output_;
49743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
49843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5006d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgvoid PrettyPrinter::PrintOut(Zone* zone, AstNode* node) {
5016d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  PrettyPrinter printer(zone);
50243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintF("%s", printer.Print(node));
50343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
50443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
50543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
50643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::Init() {
50743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (size_ == 0) {
508e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(output_ == NULL);
50943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    const int initial_size = 256;
51043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    output_ = NewArray<char>(initial_size);
51143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    size_ = initial_size;
51243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
51343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  output_[0] = '\0';
51443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  pos_ = 0;
51543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
51643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::Print(const char* format, ...) {
51943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (;;) {
52043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    va_list arguments;
52143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    va_start(arguments, format);
52270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org    int n = VSNPrintF(Vector<char>(output_, size_) + pos_,
52370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org                      format,
52470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org                      arguments);
52543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    va_end(arguments);
52643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
527769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com    if (n >= 0) {
52843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // there was enough space - we are done
52943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      pos_ += n;
53043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return;
53143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
53243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // there was not enough space - allocate more and try again
53343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      const int slack = 32;
53443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      int new_size = size_ + (size_ >> 1) + slack;
53543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      char* new_output = NewArray<char>(new_size);
536d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      MemCopy(new_output, output_, pos_);
53743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      DeleteArray(output_);
53843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      output_ = new_output;
53943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      size_ = new_size;
54043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
54143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
54243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::PrintStatements(ZoneList<Statement*>* statements) {
5467ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  if (statements == NULL) return;
54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < statements->length(); i++) {
54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (i != 0) Print(" ");
54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(statements->at(i));
55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
55143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
55243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
55408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgvoid PrettyPrinter::PrintLabels(ZoneList<const AstRawString*>* labels) {
55543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (labels != NULL) {
55643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (int i = 0; i < labels->length(); i++) {
55743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      PrintLiteral(labels->at(i), false);
55843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Print(": ");
55943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
56043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
56143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
56243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
56343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
56443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::PrintArguments(ZoneList<Expression*>* arguments) {
56543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("(");
56643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < arguments->length(); i++) {
56743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (i != 0) Print(", ");
56843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(arguments->at(i));
56943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
57043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
57143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
57243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
57343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
57443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::PrintLiteral(Handle<Object> value, bool quote) {
57543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Object* object = *value;
57643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (object->IsString()) {
57743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    String* string = String::cast(object);
57843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (quote) Print("\"");
579bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    for (int i = 0; i < string->length(); i++) {
580bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org      Print("%c", string->Get(i));
58143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
58243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (quote) Print("\"");
583ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  } else if (object->IsNull()) {
58443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("null");
585ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  } else if (object->IsTrue()) {
58643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("true");
587ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  } else if (object->IsFalse()) {
58843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("false");
589ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  } else if (object->IsUndefined()) {
59043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("undefined");
59143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else if (object->IsNumber()) {
59243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("%g", object->Number());
59343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else if (object->IsJSObject()) {
59443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // regular expression
59543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (object->IsJSFunction()) {
59643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Print("JS-Function");
59743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else if (object->IsJSArray()) {
59843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Print("JS-array[%u]", JSArray::cast(object)->length());
59943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else if (object->IsJSObject()) {
60043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Print("JS-Object");
60143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
60243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Print("?UNKNOWN?");
60343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
60443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else if (object->IsFixedArray()) {
60543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("FixedArray");
60643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
60743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("<unknown literal %p>", object);
60843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
60943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
61043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61208e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgvoid PrettyPrinter::PrintLiteral(const AstRawString* value, bool quote) {
61308e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org  PrintLiteral(value->string(), quote);
61408e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org}
61508e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org
61608e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.org
61743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::PrintParameters(Scope* scope) {
61843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("(");
61943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < scope->num_parameters(); i++) {
62043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (i  > 0) Print(", ");
62143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintLiteral(scope->parameter(i)->name(), false);
62243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
62343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
62443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
62543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::PrintDeclarations(ZoneList<Declaration*>* declarations) {
62843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < declarations->length(); i++) {
62943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (i > 0) Print(" ");
63043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(declarations->at(i));
63143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
63243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
63343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::PrintFunctionLiteral(FunctionLiteral* function) {
63643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("function ");
63743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteral(function->name(), false);
63843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintParameters(function->scope());
63943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" { ");
64043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintDeclarations(function->scope()->declarations());
64143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintStatements(function->body());
64243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" }");
64343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
64443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
64543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
64643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//-----------------------------------------------------------------------------
64743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
64843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass IndentedScope BASE_EMBEDDED {
64943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
65057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope(AstPrinter* printer, const char* txt)
6517979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org      : ast_printer_(printer) {
65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ast_printer_->PrintIndented(txt);
65343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ast_printer_->Print("\n");
65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ast_printer_->inc_indent();
65543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
65643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
65743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual ~IndentedScope() {
65843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ast_printer_->dec_indent();
65943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
66043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
66143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
662ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  AstPrinter* ast_printer_;
66343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
66443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
66543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
66643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//-----------------------------------------------------------------------------
66743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
66843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6696d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgAstPrinter::AstPrinter(Zone* zone) : PrettyPrinter(zone), indent_(0) {
67043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
67143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
67243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
67343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenAstPrinter::~AstPrinter() {
674e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(indent_ == 0);
67543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
67643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
67743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
67843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::PrintIndented(const char* txt) {
67943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < indent_; i++) {
6802d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org    Print(". ");
68143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
68243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(txt);
68343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
68443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
68543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
68643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::PrintLiteralIndented(const char* info,
68743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                      Handle<Object> value,
68843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                      bool quote) {
68943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndented(info);
69043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" ");
69143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteral(value, quote);
69243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("\n");
69343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
69443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
69543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
69643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::PrintLiteralWithModeIndented(const char* info,
69743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                              Variable* var,
69844bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org                                              Handle<Object> value) {
69943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (var == NULL) {
70043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintLiteralIndented(info, value, true);
70143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
702b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    EmbeddedVector<char, 256> buf;
70370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org    int pos = SNPrintF(buf, "%s (mode = %s", info,
70470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org                       Variable::Mode2String(var->mode()));
70570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org    SNPrintF(buf + pos, ")");
706b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    PrintLiteralIndented(buf.start(), value, true);
70743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
70843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
70943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
71043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
71108e7569a10f8edbb47b8fe70a6e160a4e0c9cd30machenbach@chromium.orgvoid AstPrinter::PrintLabelsIndented(ZoneList<const AstRawString*>* labels) {
71257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  if (labels == NULL || labels->length() == 0) return;
71357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintIndented("LABELS ");
71457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLabels(labels);
71557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Print("\n");
71643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
71743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
71843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7190b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgvoid AstPrinter::PrintIndentedVisit(const char* s, AstNode* node) {
72057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, s);
72143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node);
72243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
72343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
72443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
72543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst char* AstPrinter::PrintProgram(FunctionLiteral* program) {
72643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Init();
7277979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  { IndentedScope indent(this, "FUNC");
72843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintLiteralIndented("NAME", program->name(), true);
729d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org    PrintLiteralIndented("INFERRED NAME", program->inferred_name(), true);
73043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintParameters(program->scope());
73143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintDeclarations(program->scope()->declarations());
73243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintStatements(program->body());
73343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
73443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Output();
73543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
73643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::PrintDeclarations(ZoneList<Declaration*>* declarations) {
73943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (declarations->length() > 0) {
7407979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org    IndentedScope indent(this, "DECLS");
74143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (int i = 0; i < declarations->length(); i++) {
74243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Visit(declarations->at(i));
74343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
74443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
74543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
74643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::PrintParameters(Scope* scope) {
74943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (scope->num_parameters() > 0) {
7507979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org    IndentedScope indent(this, "PARAMS");
75143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (int i = 0; i < scope->num_parameters(); i++) {
7522d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org      PrintLiteralWithModeIndented("VAR", scope->parameter(i),
75344bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org                                   scope->parameter(i)->name());
75443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
75543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
75643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
75743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
75943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::PrintStatements(ZoneList<Statement*>* statements) {
76043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < statements->length(); i++) {
76143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(statements->at(i));
76243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
76343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
76443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
76543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
76643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::PrintArguments(ZoneList<Expression*>* arguments) {
76743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < arguments->length(); i++) {
76843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(arguments->at(i));
76943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
77043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
77143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
77243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
77343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitBlock(Block* node) {
77443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char* block_txt = node->is_initializer_block() ? "BLOCK INIT" : "BLOCK";
7757979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, block_txt);
77643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintStatements(node->statements());
77743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
77843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
77943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
78057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org// TODO(svenpanne) Start with IndentedScope.
78178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid AstPrinter::VisitVariableDeclaration(VariableDeclaration* node) {
782812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteralWithModeIndented(Variable::Mode2String(node->mode()),
783812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                               node->proxy()->var(),
784812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                               node->proxy()->name());
785812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
786812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
787812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
78857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org// TODO(svenpanne) Start with IndentedScope.
789812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgvoid AstPrinter::VisitFunctionDeclaration(FunctionDeclaration* node) {
790812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintIndented("FUNCTION ");
791812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteral(node->proxy()->name(), true);
792812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print(" = function ");
793812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteral(node->fun()->name(), false);
794812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print("\n");
79543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
79643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
79743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
79878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid AstPrinter::VisitModuleDeclaration(ModuleDeclaration* node) {
79978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  IndentedScope indent(this, "MODULE");
80078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  PrintLiteralIndented("NAME", node->proxy()->name(), true);
80178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Visit(node->module());
80278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
80378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
80478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
805812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgvoid AstPrinter::VisitImportDeclaration(ImportDeclaration* node) {
806812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  IndentedScope indent(this, "IMPORT");
807812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteralIndented("NAME", node->proxy()->name(), true);
808812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Visit(node->module());
809812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
810812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
811812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
812812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgvoid AstPrinter::VisitExportDeclaration(ExportDeclaration* node) {
813812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  IndentedScope indent(this, "EXPORT ");
814812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteral(node->proxy()->name(), true);
815812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
816812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
817812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
81878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid AstPrinter::VisitModuleLiteral(ModuleLiteral* node) {
81957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "MODULE LITERAL");
82078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  VisitBlock(node->body());
82178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
82278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
82378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
82478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid AstPrinter::VisitModuleVariable(ModuleVariable* node) {
82557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "MODULE VARIABLE");
826f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  Visit(node->proxy());
82778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
82878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
82978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
83078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid AstPrinter::VisitModulePath(ModulePath* node) {
83157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "MODULE PATH");
83257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintIndentedVisit("MODULE PATH PARENT", node->module());
83357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLiteralIndented("NAME", node->name(), true);
83478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
83578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
83678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
83778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid AstPrinter::VisitModuleUrl(ModuleUrl* node) {
83878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  PrintLiteralIndented("URL", node->url(), true);
83978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
84078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
84178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
8428e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid AstPrinter::VisitModuleStatement(ModuleStatement* node) {
84357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "MODULE STATEMENT");
8448e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  PrintLiteralIndented("NAME", node->proxy()->name(), true);
8458e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  PrintStatements(node->body()->statements());
8468e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}
8478e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
8488e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
84943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitExpressionStatement(ExpressionStatement* node) {
85057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "EXPRESSION STATEMENT");
85143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
85243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
85343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
85443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
85543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitEmptyStatement(EmptyStatement* node) {
85657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "EMPTY");
85743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
85843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
85943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
86043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitIfStatement(IfStatement* node) {
86157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "IF");
86257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintIndentedVisit("CONDITION", node->condition());
86343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("THEN", node->then_statement());
86443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->HasElseStatement()) {
86543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintIndentedVisit("ELSE", node->else_statement());
86643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
86743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
86843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
86943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
87043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitContinueStatement(ContinueStatement* node) {
87157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "CONTINUE");
87257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLabelsIndented(node->target()->labels());
87343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
87443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
87543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
87643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitBreakStatement(BreakStatement* node) {
87757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "BREAK");
87857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLabelsIndented(node->target()->labels());
87943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
88043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitReturnStatement(ReturnStatement* node) {
88357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "RETURN");
88457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Visit(node->expression());
88543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
88643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8884acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.orgvoid AstPrinter::VisitWithStatement(WithStatement* node) {
8894acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  IndentedScope indent(this, "WITH");
8904acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  PrintIndentedVisit("OBJECT", node->expression());
8914acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  PrintIndentedVisit("BODY", node->statement());
89243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
89343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
89443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
89543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitSwitchStatement(SwitchStatement* node) {
8967979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "SWITCH");
89757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLabelsIndented(node->labels());
89843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("TAG", node->tag());
89943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < node->cases()->length(); i++) {
900a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    Visit(node->cases()->at(i));
901a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  }
902a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
903a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
904a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
905a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgvoid AstPrinter::VisitCaseClause(CaseClause* clause) {
906a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (clause->is_default()) {
907a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    IndentedScope indent(this, "DEFAULT");
908a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    PrintStatements(clause->statements());
909a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  } else {
910a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    IndentedScope indent(this, "CASE");
911a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    Visit(clause->label());
912a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    PrintStatements(clause->statements());
91343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
91443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
91543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
91643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9179d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid AstPrinter::VisitDoWhileStatement(DoWhileStatement* node) {
9187979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "DO");
91957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLabelsIndented(node->labels());
9209d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  PrintIndentedVisit("BODY", node->body());
9219d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  PrintIndentedVisit("COND", node->cond());
9229d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com}
9239d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
9249d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
9259d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid AstPrinter::VisitWhileStatement(WhileStatement* node) {
9267979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "WHILE");
92757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLabelsIndented(node->labels());
9289d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  PrintIndentedVisit("COND", node->cond());
9299d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  PrintIndentedVisit("BODY", node->body());
9309d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com}
9319d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
9329d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
9339d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid AstPrinter::VisitForStatement(ForStatement* node) {
9347979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "FOR");
93557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLabelsIndented(node->labels());
93643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->init()) PrintIndentedVisit("INIT", node->init());
93743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->cond()) PrintIndentedVisit("COND", node->cond());
9389d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  PrintIndentedVisit("BODY", node->body());
93943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->next()) PrintIndentedVisit("NEXT", node->next());
94043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
94143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitForInStatement(ForInStatement* node) {
9447979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "FOR IN");
94543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("FOR", node->each());
94643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("IN", node->enumerable());
94743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("BODY", node->body());
94843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
94943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
95043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9511fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgvoid AstPrinter::VisitForOfStatement(ForOfStatement* node) {
9521fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  IndentedScope indent(this, "FOR OF");
9531fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  PrintIndentedVisit("FOR", node->each());
9541fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  PrintIndentedVisit("OF", node->iterable());
9551fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  PrintIndentedVisit("BODY", node->body());
9561fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}
9571fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
9581fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
9599d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid AstPrinter::VisitTryCatchStatement(TryCatchStatement* node) {
9607979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "TRY CATCH");
96143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("TRY", node->try_block());
9624f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  PrintLiteralWithModeIndented("CATCHVAR",
9634f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org                               node->variable(),
9644f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org                               node->variable()->name());
96543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("CATCH", node->catch_block());
96643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
96743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
96843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9699d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid AstPrinter::VisitTryFinallyStatement(TryFinallyStatement* node) {
9707979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "TRY FINALLY");
97143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("TRY", node->try_block());
97243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("FINALLY", node->finally_block());
97343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
97443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
97543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
97643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitDebuggerStatement(DebuggerStatement* node) {
9777979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "DEBUGGER");
97843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
97943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
98043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
98143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitFunctionLiteral(FunctionLiteral* node) {
9827979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "FUNC LITERAL");
98343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteralIndented("NAME", node->name(), false);
984d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  PrintLiteralIndented("INFERRED NAME", node->inferred_name(), false);
98543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintParameters(node->scope());
98643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // We don't want to see the function literal in this case: it
98743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // will be printed via PrintProgram when the code for it is
98843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // generated.
98943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // PrintStatements(node->body());
99043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
99143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
99243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
993a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgvoid AstPrinter::VisitClassLiteral(ClassLiteral* node) {
994a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  IndentedScope indent(this, "CLASS LITERAL");
995a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  PrintLiteralIndented("NAME", node->name(), false);
996a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org}
997a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
998a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
999fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.orgvoid AstPrinter::VisitNativeFunctionLiteral(NativeFunctionLiteral* node) {
1000fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  IndentedScope indent(this, "NATIVE FUNC LITERAL");
1001fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  PrintLiteralIndented("NAME", node->name(), false);
100243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
100343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
100443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
100543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitConditional(Conditional* node) {
10067979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "CONDITIONAL");
100757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintIndentedVisit("CONDITION", node->condition());
100843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("THEN", node->then_expression());
100943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("ELSE", node->else_expression());
101043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
101143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
101243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
101357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org// TODO(svenpanne) Start with IndentedScope.
101443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitLiteral(Literal* node) {
10151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  PrintLiteralIndented("LITERAL", node->value(), true);
101643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
101743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
101843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
101943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitRegExpLiteral(RegExpLiteral* node) {
10207979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "REGEXP LITERAL");
1021e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  PrintLiteralIndented("PATTERN", node->pattern(), false);
1022e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  PrintLiteralIndented("FLAGS", node->flags(), false);
102343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
102443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
102543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
102643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitObjectLiteral(ObjectLiteral* node) {
10277979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "OBJ LITERAL");
102843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < node->properties()->length(); i++) {
102943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    const char* prop_kind = NULL;
103043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    switch (node->properties()->at(i)->kind()) {
103143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      case ObjectLiteral::Property::CONSTANT:
103243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        prop_kind = "PROPERTY - CONSTANT";
103343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        break;
103443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      case ObjectLiteral::Property::COMPUTED:
103543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        prop_kind = "PROPERTY - COMPUTED";
103643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        break;
10370b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org      case ObjectLiteral::Property::MATERIALIZED_LITERAL:
10380b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org        prop_kind = "PROPERTY - MATERIALIZED_LITERAL";
10390b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org        break;
104043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      case ObjectLiteral::Property::PROTOTYPE:
104143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        prop_kind = "PROPERTY - PROTOTYPE";
104243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        break;
104343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      case ObjectLiteral::Property::GETTER:
104443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        prop_kind = "PROPERTY - GETTER";
104543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        break;
104643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      case ObjectLiteral::Property::SETTER:
104743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        prop_kind = "PROPERTY - SETTER";
104843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        break;
104943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      default:
105043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        UNREACHABLE();
105143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
10527979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org    IndentedScope prop(this, prop_kind);
105343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintIndentedVisit("KEY", node->properties()->at(i)->key());
105443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintIndentedVisit("VALUE", node->properties()->at(i)->value());
105543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
105643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
105743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
105843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
105943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitArrayLiteral(ArrayLiteral* node) {
10607979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "ARRAY LITERAL");
106143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->values()->length() > 0) {
10627979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org    IndentedScope indent(this, "VALUES");
106343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (int i = 0; i < node->values()->length(); i++) {
106443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Visit(node->values()->at(i));
106543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
106643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
106743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
106843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
106943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
107057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org// TODO(svenpanne) Start with IndentedScope.
107143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitVariableProxy(VariableProxy* node) {
107243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Variable* var = node->var();
107383e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  EmbeddedVector<char, 128> buf;
107470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  int pos = SNPrintF(buf, "VAR PROXY");
107583e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  switch (var->location()) {
107683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org    case Variable::UNALLOCATED:
107783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org      break;
107883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org    case Variable::PARAMETER:
107970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org      SNPrintF(buf + pos, " parameter[%d]", var->index());
108083e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org      break;
108183e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org    case Variable::LOCAL:
108270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org      SNPrintF(buf + pos, " local[%d]", var->index());
108383e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org      break;
108483e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org    case Variable::CONTEXT:
108570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org      SNPrintF(buf + pos, " context[%d]", var->index());
108683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org      break;
108783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org    case Variable::LOOKUP:
108870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org      SNPrintF(buf + pos, " lookup");
108983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org      break;
109043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
109183e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  PrintLiteralWithModeIndented(buf.start(), var, node->name());
109243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
109343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitAssignment(Assignment* node) {
109657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, Token::Name(node->op()));
109743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->target());
109843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->value());
109943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
110043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
110143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1102f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvoid AstPrinter::VisitYield(Yield* node) {
110357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "YIELD");
110457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Visit(node->expression());
1105f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
1106f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
1107f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
110843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitThrow(Throw* node) {
110957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "THROW");
111057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Visit(node->exception());
111143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
111243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
111343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
111443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitProperty(Property* node) {
111557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "PROPERTY");
111643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->obj());
111743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Literal* literal = node->key()->AsLiteral();
11181510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (literal != NULL && literal->value()->IsInternalizedString()) {
11191510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    PrintLiteralIndented("NAME", literal->value(), false);
112043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
112143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintIndentedVisit("KEY", node->key());
112243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
112343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
112443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
112543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
112643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitCall(Call* node) {
11277979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "CALL");
112843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
112943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintArguments(node->arguments());
113043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
113143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitCallNew(CallNew* node) {
11347979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "CALL NEW");
113543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
113643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintArguments(node->arguments());
113743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
113843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
114043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitCallRuntime(CallRuntime* node) {
114157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "CALL RUNTIME");
114257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLiteralIndented("NAME", node->name(), false);
114343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintArguments(node->arguments());
114443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
114543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
114643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
114743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitUnaryOperation(UnaryOperation* node) {
114857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, Token::Name(node->op()));
114957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Visit(node->expression());
115043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
115143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
115243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
115343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitCountOperation(CountOperation* node) {
1154b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  EmbeddedVector<char, 128> buf;
115570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  SNPrintF(buf, "%s %s", (node->is_prefix() ? "PRE" : "POST"),
115670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org           Token::Name(node->op()));
115757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, buf.start());
115857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Visit(node->expression());
115943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
116043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
116143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
116243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitBinaryOperation(BinaryOperation* node) {
116357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, Token::Name(node->op()));
116443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->left());
116543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->right());
116643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
116743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
116843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
116943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitCompareOperation(CompareOperation* node) {
117057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, Token::Name(node->op()));
117143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->left());
117243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->right());
117343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
117443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
117543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
117643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitThisFunction(ThisFunction* node) {
11777979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "THIS-FUNCTION");
117843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
117943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11805e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
11815e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgvoid AstPrinter::VisitSuperReference(SuperReference* node) {
11825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  IndentedScope indent(this, "SUPER-REFERENCE");
11835e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
11845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
118543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif  // DEBUG
118643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
118743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
1188