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
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/prettyprinter.h"
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/scopes.h"
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/platform.h"
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
1471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifdef DEBUG
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
186d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgPrettyPrinter::PrettyPrinter(Zone* zone) {
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  output_ = NULL;
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  size_ = 0;
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  pos_ = 0;
226d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  InitializeAstVisitor(zone);
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenPrettyPrinter::~PrettyPrinter() {
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  DeleteArray(output_);
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitBlock(Block* node) {
3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!node->is_initializer_block()) Print("{ ");
3343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintStatements(node->statements());
3443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->statements()->length() > 0) Print(" ");
3543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (!node->is_initializer_block()) Print("}");
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid PrettyPrinter::VisitVariableDeclaration(VariableDeclaration* node) {
4043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("var ");
4143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteral(node->proxy()->name(), false);
42812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print(";");
43812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
44812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
45812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
46812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgvoid PrettyPrinter::VisitFunctionDeclaration(FunctionDeclaration* node) {
47812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print("function ");
48812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteral(node->proxy()->name(), false);
49812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print(" = ");
50812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintFunctionLiteral(node->fun());
5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(";");
5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
5343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid PrettyPrinter::VisitModuleDeclaration(ModuleDeclaration* node) {
5678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Print("module ");
5778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  PrintLiteral(node->proxy()->name(), false);
5878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Print(" = ");
5978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Visit(node->module());
6078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Print(";");
6178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
6278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
6378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
64812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgvoid PrettyPrinter::VisitImportDeclaration(ImportDeclaration* node) {
65812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print("import ");
66812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteral(node->proxy()->name(), false);
67812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print(" from ");
68812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Visit(node->module());
69812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print(";");
70812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
71812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
72812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
73812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgvoid PrettyPrinter::VisitExportDeclaration(ExportDeclaration* node) {
74812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print("export ");
75812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteral(node->proxy()->name(), false);
76812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print(";");
77812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
78812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
79812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
8078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid PrettyPrinter::VisitModuleLiteral(ModuleLiteral* node) {
8178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  VisitBlock(node->body());
8278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
8378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
8478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
8578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid PrettyPrinter::VisitModuleVariable(ModuleVariable* node) {
86f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  Visit(node->proxy());
8778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
8878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
8978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
9078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid PrettyPrinter::VisitModulePath(ModulePath* node) {
9178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Visit(node->module());
9278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Print(".");
9378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  PrintLiteral(node->name(), false);
9478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
9578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
9678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
9778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid PrettyPrinter::VisitModuleUrl(ModuleUrl* node) {
9878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Print("at ");
9978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  PrintLiteral(node->url(), true);
10078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
10178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
10278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
1038e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid PrettyPrinter::VisitModuleStatement(ModuleStatement* node) {
1048e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  Print("module ");
1058e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  PrintLiteral(node->proxy()->name(), false);
1068e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  Print(" ");
1078e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  Visit(node->body());
1088e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}
1098e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
1108e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
11143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitExpressionStatement(ExpressionStatement* node) {
11243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
11343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(";");
11443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
11543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitEmptyStatement(EmptyStatement* node) {
11843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(";");
11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
12043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitIfStatement(IfStatement* node) {
12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("if (");
12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->condition());
12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(") ");
12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->then_statement());
12743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->HasElseStatement()) {
12843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print(" else ");
12943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(node->else_statement());
13043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
13143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitContinueStatement(ContinueStatement* node) {
13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("continue");
1363ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org  ZoneStringList* labels = node->target()->labels();
13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (labels != NULL) {
13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print(" ");
13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ASSERT(labels->length() > 0);  // guaranteed to have at least one entry
14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintLiteral(labels->at(0), false);  // any label from the list is fine
14143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(";");
14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
14443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitBreakStatement(BreakStatement* node) {
14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("break");
1483ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.org  ZoneStringList* labels = node->target()->labels();
14943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (labels != NULL) {
15043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print(" ");
15143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ASSERT(labels->length() > 0);  // guaranteed to have at least one entry
15243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintLiteral(labels->at(0), false);  // any label from the list is fine
15343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(";");
15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
15843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitReturnStatement(ReturnStatement* node) {
15943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("return ");
16043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
16143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(";");
16243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
16343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1654acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.orgvoid PrettyPrinter::VisitWithStatement(WithStatement* node) {
1664acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  Print("with (");
16743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
16843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(") ");
1694acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  Visit(node->statement());
17043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
17143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
17343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitSwitchStatement(SwitchStatement* node) {
17443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLabels(node->labels());
17543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("switch (");
17643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->tag());
17743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(") { ");
17843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ZoneList<CaseClause*>* cases = node->cases();
17943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < cases->length(); i++)
180a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    Visit(cases->at(i));
18143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("}");
18243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
18343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
18443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
185a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgvoid PrettyPrinter::VisitCaseClause(CaseClause* clause) {
186a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (clause->is_default()) {
187a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    Print("default");
188a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  } else {
189a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    Print("case ");
190a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    Visit(clause->label());
191a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  }
192a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  Print(": ");
193a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  PrintStatements(clause->statements());
194a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (clause->statements()->length() > 0)
195a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    Print(" ");
196a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
197a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
198a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
1999d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid PrettyPrinter::VisitDoWhileStatement(DoWhileStatement* node) {
20043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLabels(node->labels());
2019d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print("do ");
2029d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Visit(node->body());
2039d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print(" while (");
2049d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Visit(node->cond());
2059d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print(");");
2069d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com}
20743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
20843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2099d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid PrettyPrinter::VisitWhileStatement(WhileStatement* node) {
2109d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  PrintLabels(node->labels());
2119d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print("while (");
2129d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Visit(node->cond());
2139d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print(") ");
2149d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Visit(node->body());
2159d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com}
2169d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
2179d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
2189d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid PrettyPrinter::VisitForStatement(ForStatement* node) {
2199d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  PrintLabels(node->labels());
2209d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print("for (");
2219d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  if (node->init() != NULL) {
2229d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    Visit(node->init());
2239d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    Print(" ");
2249d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  } else {
2259d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    Print("; ");
2269d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  }
2279d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  if (node->cond() != NULL) Visit(node->cond());
2289d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print("; ");
2299d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  if (node->next() != NULL) {
2309d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    Visit(node->next());  // prints extra ';', unfortunately
2319d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com    // to fix: should use Expression for next
23243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
2339d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Print(") ");
2349d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  Visit(node->body());
23543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
23643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
23843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitForInStatement(ForInStatement* node) {
23943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLabels(node->labels());
24043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("for (");
24143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->each());
24243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" in ");
24343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->enumerable());
24443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(") ");
24543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->body());
24643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
24743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
24843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2491fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgvoid PrettyPrinter::VisitForOfStatement(ForOfStatement* node) {
2501fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  PrintLabels(node->labels());
2511fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Print("for (");
2521fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Visit(node->each());
2531fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Print(" of ");
2541fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Visit(node->iterable());
2551fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Print(") ");
2561fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Visit(node->body());
2571fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}
2581fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
2591fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
2609d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid PrettyPrinter::VisitTryCatchStatement(TryCatchStatement* node) {
26143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("try ");
26243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->try_block());
26343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" catch (");
2646d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  const bool quote = false;
2654f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  PrintLiteral(node->variable()->name(), quote);
26643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(") ");
26743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->catch_block());
26843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
26943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
27043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2719d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid PrettyPrinter::VisitTryFinallyStatement(TryFinallyStatement* node) {
27243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("try ");
27343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->try_block());
27443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" finally ");
27543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->finally_block());
27643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
27743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
27843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
27943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitDebuggerStatement(DebuggerStatement* node) {
28043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("debugger ");
28143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
28243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
28443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitFunctionLiteral(FunctionLiteral* node) {
28543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("(");
28643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintFunctionLiteral(node);
28743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
28843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
28943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
291fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.orgvoid PrettyPrinter::VisitNativeFunctionLiteral(NativeFunctionLiteral* node) {
29243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("(");
293fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  PrintLiteral(node->name(), false);
29443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
29543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
29643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
29843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitConditional(Conditional* node) {
29943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->condition());
30043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" ? ");
30143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->then_expression());
30243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" : ");
30343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->else_expression());
30443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
30543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
30643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
30743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitLiteral(Literal* node) {
3081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  PrintLiteral(node->value(), true);
30943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
31043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
31243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitRegExpLiteral(RegExpLiteral* node) {
31343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" RegExp(");
31443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteral(node->pattern(), false);
31543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(",");
31643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteral(node->flags(), false);
31743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(") ");
31843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
31943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
32143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitObjectLiteral(ObjectLiteral* node) {
32243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("{ ");
32343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < node->properties()->length(); i++) {
32443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (i != 0) Print(",");
32543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ObjectLiteral::Property* property = node->properties()->at(i);
32643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print(" ");
32743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(property->key());
32843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print(": ");
32943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(property->value());
33043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
33143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" }");
33243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
33343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
33543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitArrayLiteral(ArrayLiteral* node) {
33643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("[ ");
33743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < node->values()->length(); i++) {
33843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (i != 0) Print(",");
33943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(node->values()->at(i));
34043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
34143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" ]");
34243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
34343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitVariableProxy(VariableProxy* node) {
34643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteral(node->name(), false);
34743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
34843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
34943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitAssignment(Assignment* node) {
35143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->target());
35243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" %s ", Token::String(node->op()));
35343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->value());
35443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
35543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
35643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
357f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvoid PrettyPrinter::VisitYield(Yield* node) {
358f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  Print("yield ");
359f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  Visit(node->expression());
360f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
361f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
362f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
36343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitThrow(Throw* node) {
36443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("throw ");
36543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->exception());
36643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
36743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
36943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitProperty(Property* node) {
37043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Expression* key = node->key();
37143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Literal* literal = key->AsLiteral();
3721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (literal != NULL && literal->value()->IsInternalizedString()) {
37343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("(");
37443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(node->obj());
37543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print(").");
3761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    PrintLiteral(literal->value(), false);
37743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
37843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(node->obj());
37943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("[");
38043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(key);
38143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("]");
38243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
38343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
38443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
38543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
38643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitCall(Call* node) {
38743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
38843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintArguments(node->arguments());
38943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
39043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitCallNew(CallNew* node) {
39343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("new (");
39443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
39543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
39643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintArguments(node->arguments());
39743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
39843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
39943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitCallRuntime(CallRuntime* node) {
40143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("%%");
40243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteral(node->name(), false);
40343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintArguments(node->arguments());
40443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
40543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
40743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitUnaryOperation(UnaryOperation* node) {
40840cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org  Token::Value op = node->op();
40940cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org  bool needsSpace =
41040cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org      op == Token::DELETE || op == Token::TYPEOF || op == Token::VOID;
41140cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org  Print("(%s%s", Token::String(op), needsSpace ? " " : "");
41243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
41343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
41443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
41543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
41743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitCountOperation(CountOperation* node) {
41843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("(");
41943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->is_prefix()) Print("%s", Token::String(node->op()));
42043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
42143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->is_postfix()) Print("%s", Token::String(node->op()));
42243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
42343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
42443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
42643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitBinaryOperation(BinaryOperation* node) {
42743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("(");
42843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->left());
42940cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org  Print(" %s ", Token::String(node->op()));
43043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->right());
43143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
43243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
43343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
43543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitCompareOperation(CompareOperation* node) {
43643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("(");
43743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->left());
43840cb878ef373bea9bdf7998829891e4096751dd0danno@chromium.org  Print(" %s ", Token::String(node->op()));
43943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->right());
44043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
44143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
44243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::VisitThisFunction(ThisFunction* node) {
44543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("<this-function>");
44643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
44743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
44843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4490b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgconst char* PrettyPrinter::Print(AstNode* node) {
45043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Init();
45143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node);
45243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return output_;
45343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
45443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
45543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst char* PrettyPrinter::PrintExpression(FunctionLiteral* program) {
45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Init();
45843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ExpressionStatement* statement =
45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    program->body()->at(0)->AsExpressionStatement();
46043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(statement->expression());
46143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return output_;
46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
46343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
46443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
46543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst char* PrettyPrinter::PrintProgram(FunctionLiteral* program) {
46643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Init();
46743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintStatements(program->body());
46843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("\n");
46943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return output_;
47043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
47143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
47243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
4736d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgvoid PrettyPrinter::PrintOut(Zone* zone, AstNode* node) {
4746d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.org  PrettyPrinter printer(zone);
47543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintF("%s", printer.Print(node));
47643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
47743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
47843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
47943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::Init() {
48043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (size_ == 0) {
48143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ASSERT(output_ == NULL);
48243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    const int initial_size = 256;
48343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    output_ = NewArray<char>(initial_size);
48443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    size_ = initial_size;
48543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
48643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  output_[0] = '\0';
48743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  pos_ = 0;
48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
48943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
49143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::Print(const char* format, ...) {
49243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (;;) {
49343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    va_list arguments;
49443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    va_start(arguments, format);
49570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org    int n = VSNPrintF(Vector<char>(output_, size_) + pos_,
49670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org                      format,
49770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org                      arguments);
49843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    va_end(arguments);
49943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
500769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com    if (n >= 0) {
50143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // there was enough space - we are done
50243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      pos_ += n;
50343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      return;
50443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
50543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      // there was not enough space - allocate more and try again
50643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      const int slack = 32;
50743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      int new_size = size_ + (size_ >> 1) + slack;
50843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      char* new_output = NewArray<char>(new_size);
509d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org      MemCopy(new_output, output_, pos_);
51043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      DeleteArray(output_);
51143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      output_ = new_output;
51243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      size_ = new_size;
51343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
51443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
51543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
51643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
51843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::PrintStatements(ZoneList<Statement*>* statements) {
5197ad65226b3ba6f9250a5ee869ee77e2b9258fc91ricow@chromium.org  if (statements == NULL) return;
52043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < statements->length(); i++) {
52143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (i != 0) Print(" ");
52243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(statements->at(i));
52343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
52443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
52543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
52643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
5273ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.orgvoid PrettyPrinter::PrintLabels(ZoneStringList* labels) {
52843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (labels != NULL) {
52943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (int i = 0; i < labels->length(); i++) {
53043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      PrintLiteral(labels->at(i), false);
53143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Print(": ");
53243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
53343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
53443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
53543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
53743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::PrintArguments(ZoneList<Expression*>* arguments) {
53843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("(");
53943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < arguments->length(); i++) {
54043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (i != 0) Print(", ");
54143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(arguments->at(i));
54243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
54443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
54543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::PrintLiteral(Handle<Object> value, bool quote) {
54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Object* object = *value;
54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (object->IsString()) {
55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    String* string = String::cast(object);
55143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (quote) Print("\"");
552bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org    for (int i = 0; i < string->length(); i++) {
553bb29dc9819bb6f495ab6eddd2543965eb97a8e43ager@chromium.org      Print("%c", string->Get(i));
55443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
55543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (quote) Print("\"");
556ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  } else if (object->IsNull()) {
55743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("null");
558ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  } else if (object->IsTrue()) {
55943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("true");
560ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  } else if (object->IsFalse()) {
56143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("false");
562ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  } else if (object->IsUndefined()) {
56343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("undefined");
56443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else if (object->IsNumber()) {
56543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("%g", object->Number());
56643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else if (object->IsJSObject()) {
56743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    // regular expression
56843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (object->IsJSFunction()) {
56943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Print("JS-Function");
57043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else if (object->IsJSArray()) {
57143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Print("JS-array[%u]", JSArray::cast(object)->length());
57243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else if (object->IsJSObject()) {
57343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Print("JS-Object");
57443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    } else {
57543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Print("?UNKNOWN?");
57643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
57743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else if (object->IsFixedArray()) {
57843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("FixedArray");
57943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
58043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Print("<unknown literal %p>", object);
58143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
58243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
58343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
58443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
58543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::PrintParameters(Scope* scope) {
58643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("(");
58743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < scope->num_parameters(); i++) {
58843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (i  > 0) Print(", ");
58943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintLiteral(scope->parameter(i)->name(), false);
59043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
59143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(")");
59243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
59343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
59443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
59543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::PrintDeclarations(ZoneList<Declaration*>* declarations) {
59643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < declarations->length(); i++) {
59743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    if (i > 0) Print(" ");
59843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(declarations->at(i));
59943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
60043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
60143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
60343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid PrettyPrinter::PrintFunctionLiteral(FunctionLiteral* function) {
60443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("function ");
60543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteral(function->name(), false);
60643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintParameters(function->scope());
60743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" { ");
60843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintDeclarations(function->scope()->declarations());
60943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintStatements(function->body());
61043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" }");
61143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
61243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//-----------------------------------------------------------------------------
61543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
61643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass IndentedScope BASE_EMBEDDED {
61743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
61857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope(AstPrinter* printer, const char* txt)
6197979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org      : ast_printer_(printer) {
62043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ast_printer_->PrintIndented(txt);
62143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ast_printer_->Print("\n");
62243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ast_printer_->inc_indent();
62343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
62443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  virtual ~IndentedScope() {
62643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    ast_printer_->dec_indent();
62743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
62843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
62943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
630ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  AstPrinter* ast_printer_;
63143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
63243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//-----------------------------------------------------------------------------
63543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
63643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6376d26cbb00b8ff12ecf86400c59f4a18d3850f22dmachenbach@chromium.orgAstPrinter::AstPrinter(Zone* zone) : PrettyPrinter(zone), indent_(0) {
63843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
63943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
64043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
64143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenAstPrinter::~AstPrinter() {
64243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ASSERT(indent_ == 0);
64343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
64443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
64543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
64643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::PrintIndented(const char* txt) {
64743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < indent_; i++) {
6482d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org    Print(". ");
64943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
65043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(txt);
65143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
65343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::PrintLiteralIndented(const char* info,
65543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                      Handle<Object> value,
65643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                      bool quote) {
65743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndented(info);
65843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print(" ");
65943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteral(value, quote);
66043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Print("\n");
66143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
66243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
66343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
66443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::PrintLiteralWithModeIndented(const char* info,
66543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen                                              Variable* var,
66644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org                                              Handle<Object> value) {
66743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (var == NULL) {
66843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintLiteralIndented(info, value, true);
66943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
670b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    EmbeddedVector<char, 256> buf;
67170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org    int pos = SNPrintF(buf, "%s (mode = %s", info,
67270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org                       Variable::Mode2String(var->mode()));
67370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org    SNPrintF(buf + pos, ")");
674b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org    PrintLiteralIndented(buf.start(), value, true);
67543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
67643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
67743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
67843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6793ee7a7ed19002e4a0efbf6cdb2a201f21763a80adanno@chromium.orgvoid AstPrinter::PrintLabelsIndented(ZoneStringList* labels) {
68057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  if (labels == NULL || labels->length() == 0) return;
68157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintIndented("LABELS ");
68257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLabels(labels);
68357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Print("\n");
68443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
68543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
68643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6870b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.orgvoid AstPrinter::PrintIndentedVisit(const char* s, AstNode* node) {
68857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, s);
68943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node);
69043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
69143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
69243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
69343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst char* AstPrinter::PrintProgram(FunctionLiteral* program) {
69443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Init();
6957979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  { IndentedScope indent(this, "FUNC");
69643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintLiteralIndented("NAME", program->name(), true);
697d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org    PrintLiteralIndented("INFERRED NAME", program->inferred_name(), true);
69843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintParameters(program->scope());
69943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintDeclarations(program->scope()->declarations());
70043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintStatements(program->body());
70143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
70243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  return Output();
70343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
70443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
70543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
70643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::PrintDeclarations(ZoneList<Declaration*>* declarations) {
70743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (declarations->length() > 0) {
7087979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org    IndentedScope indent(this, "DECLS");
70943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (int i = 0; i < declarations->length(); i++) {
71043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Visit(declarations->at(i));
71143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
71243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
71343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
71443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
71543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
71643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::PrintParameters(Scope* scope) {
71743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (scope->num_parameters() > 0) {
7187979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org    IndentedScope indent(this, "PARAMS");
71943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (int i = 0; i < scope->num_parameters(); i++) {
7202d18d10b30bbe822dcb5e2d6e90fd7863496243ckasperl@chromium.org      PrintLiteralWithModeIndented("VAR", scope->parameter(i),
72144bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org                                   scope->parameter(i)->name());
72243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
72343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
72443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
72543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
72643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
72743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::PrintStatements(ZoneList<Statement*>* statements) {
72843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < statements->length(); i++) {
72943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(statements->at(i));
73043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
73143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
73243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
73443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::PrintArguments(ZoneList<Expression*>* arguments) {
73543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < arguments->length(); i++) {
73643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    Visit(arguments->at(i));
73743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
73843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
73943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitBlock(Block* node) {
74243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  const char* block_txt = node->is_initializer_block() ? "BLOCK INIT" : "BLOCK";
7437979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, block_txt);
74443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintStatements(node->statements());
74543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
74643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
74857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org// TODO(svenpanne) Start with IndentedScope.
74978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid AstPrinter::VisitVariableDeclaration(VariableDeclaration* node) {
750812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteralWithModeIndented(Variable::Mode2String(node->mode()),
751812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                               node->proxy()->var(),
752812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                               node->proxy()->name());
753812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
754812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
755812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
75657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org// TODO(svenpanne) Start with IndentedScope.
757812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgvoid AstPrinter::VisitFunctionDeclaration(FunctionDeclaration* node) {
758812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintIndented("FUNCTION ");
759812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteral(node->proxy()->name(), true);
760812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print(" = function ");
761812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteral(node->fun()->name(), false);
762812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Print("\n");
76343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
76443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
76543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
76678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid AstPrinter::VisitModuleDeclaration(ModuleDeclaration* node) {
76778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  IndentedScope indent(this, "MODULE");
76878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  PrintLiteralIndented("NAME", node->proxy()->name(), true);
76978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  Visit(node->module());
77078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
77178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
77278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
773812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgvoid AstPrinter::VisitImportDeclaration(ImportDeclaration* node) {
774812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  IndentedScope indent(this, "IMPORT");
775812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteralIndented("NAME", node->proxy()->name(), true);
776812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  Visit(node->module());
777812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
778812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
779812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
780812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgvoid AstPrinter::VisitExportDeclaration(ExportDeclaration* node) {
781812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  IndentedScope indent(this, "EXPORT ");
782812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  PrintLiteral(node->proxy()->name(), true);
783812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
784812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
785812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
78678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid AstPrinter::VisitModuleLiteral(ModuleLiteral* node) {
78757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "MODULE LITERAL");
78878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  VisitBlock(node->body());
78978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
79078d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
79178d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
79278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid AstPrinter::VisitModuleVariable(ModuleVariable* node) {
79357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "MODULE VARIABLE");
794f7a588466d1e61e14fec951e5f10c7cec501b3b4jkummerow@chromium.org  Visit(node->proxy());
79578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
79678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
79778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
79878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid AstPrinter::VisitModulePath(ModulePath* node) {
79957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "MODULE PATH");
80057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintIndentedVisit("MODULE PATH PARENT", node->module());
80157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLiteralIndented("NAME", node->name(), true);
80278d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
80378d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
80478d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
80578d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.orgvoid AstPrinter::VisitModuleUrl(ModuleUrl* node) {
80678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  PrintLiteralIndented("URL", node->url(), true);
80778d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org}
80878d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
80978d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org
8108e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.orgvoid AstPrinter::VisitModuleStatement(ModuleStatement* node) {
81157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "MODULE STATEMENT");
8128e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  PrintLiteralIndented("NAME", node->proxy()->name(), true);
8138e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org  PrintStatements(node->body()->statements());
8148e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}
8158e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
8168e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org
81743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitExpressionStatement(ExpressionStatement* node) {
81857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "EXPRESSION STATEMENT");
81943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
82043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
82143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitEmptyStatement(EmptyStatement* node) {
82457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "EMPTY");
82543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
82643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
82843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitIfStatement(IfStatement* node) {
82957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "IF");
83057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintIndentedVisit("CONDITION", node->condition());
83143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("THEN", node->then_statement());
83243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->HasElseStatement()) {
83343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintIndentedVisit("ELSE", node->else_statement());
83443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
83543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
83643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
83743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
83843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitContinueStatement(ContinueStatement* node) {
83957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "CONTINUE");
84057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLabelsIndented(node->target()->labels());
84143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
84243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
84343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
84443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitBreakStatement(BreakStatement* node) {
84557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "BREAK");
84657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLabelsIndented(node->target()->labels());
84743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
84843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
84943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
85043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitReturnStatement(ReturnStatement* node) {
85157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "RETURN");
85257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Visit(node->expression());
85343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
85443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
85543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8564acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.orgvoid AstPrinter::VisitWithStatement(WithStatement* node) {
8574acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  IndentedScope indent(this, "WITH");
8584acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  PrintIndentedVisit("OBJECT", node->expression());
8594acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  PrintIndentedVisit("BODY", node->statement());
86043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
86143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
86243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
86343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitSwitchStatement(SwitchStatement* node) {
8647979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "SWITCH");
86557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLabelsIndented(node->labels());
86643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("TAG", node->tag());
86743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < node->cases()->length(); i++) {
868a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    Visit(node->cases()->at(i));
869a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  }
870a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org}
871a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
872a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org
873a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.orgvoid AstPrinter::VisitCaseClause(CaseClause* clause) {
874a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  if (clause->is_default()) {
875a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    IndentedScope indent(this, "DEFAULT");
876a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    PrintStatements(clause->statements());
877a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org  } else {
878a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    IndentedScope indent(this, "CASE");
879a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    Visit(clause->label());
880a2e1a40f85577979749d4c0d6de30e992d996659mstarzinger@chromium.org    PrintStatements(clause->statements());
88143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
88243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
88343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
88443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
8859d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid AstPrinter::VisitDoWhileStatement(DoWhileStatement* node) {
8867979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "DO");
88757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLabelsIndented(node->labels());
8889d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  PrintIndentedVisit("BODY", node->body());
8899d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  PrintIndentedVisit("COND", node->cond());
8909d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com}
8919d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
8929d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
8939d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid AstPrinter::VisitWhileStatement(WhileStatement* node) {
8947979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "WHILE");
89557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLabelsIndented(node->labels());
8969d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  PrintIndentedVisit("COND", node->cond());
8979d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  PrintIndentedVisit("BODY", node->body());
8989d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com}
8999d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
9009d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com
9019d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid AstPrinter::VisitForStatement(ForStatement* node) {
9027979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "FOR");
90357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLabelsIndented(node->labels());
90443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->init()) PrintIndentedVisit("INIT", node->init());
90543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->cond()) PrintIndentedVisit("COND", node->cond());
9069d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.com  PrintIndentedVisit("BODY", node->body());
90743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->next()) PrintIndentedVisit("NEXT", node->next());
90843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
90943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
91043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
91143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitForInStatement(ForInStatement* node) {
9127979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "FOR IN");
91343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("FOR", node->each());
91443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("IN", node->enumerable());
91543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("BODY", node->body());
91643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
91743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
91843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9191fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgvoid AstPrinter::VisitForOfStatement(ForOfStatement* node) {
9201fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  IndentedScope indent(this, "FOR OF");
9211fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  PrintIndentedVisit("FOR", node->each());
9221fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  PrintIndentedVisit("OF", node->iterable());
9231fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  PrintIndentedVisit("BODY", node->body());
9241fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}
9251fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
9261fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
9279d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid AstPrinter::VisitTryCatchStatement(TryCatchStatement* node) {
9287979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "TRY CATCH");
92943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("TRY", node->try_block());
9304f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org  PrintLiteralWithModeIndented("CATCHVAR",
9314f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org                               node->variable(),
9324f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org                               node->variable()->name());
93343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("CATCH", node->catch_block());
93443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
93543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
93643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
9379d58c2b1c27d8b2890b9bd46e57d3842b09e0292christian.plesner.hansen@gmail.comvoid AstPrinter::VisitTryFinallyStatement(TryFinallyStatement* node) {
9387979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "TRY FINALLY");
93943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("TRY", node->try_block());
94043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("FINALLY", node->finally_block());
94143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
94243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitDebuggerStatement(DebuggerStatement* node) {
9457979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "DEBUGGER");
94643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
94743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
94943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitFunctionLiteral(FunctionLiteral* node) {
9507979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "FUNC LITERAL");
95143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintLiteralIndented("NAME", node->name(), false);
952d1e3e722d649dfcccf8699a801743c9a5426b0bckasperl@chromium.org  PrintLiteralIndented("INFERRED NAME", node->inferred_name(), false);
95343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintParameters(node->scope());
95443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // We don't want to see the function literal in this case: it
95543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // will be printed via PrintProgram when the code for it is
95643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // generated.
95743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // PrintStatements(node->body());
95843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
95943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
96043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
961fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.orgvoid AstPrinter::VisitNativeFunctionLiteral(NativeFunctionLiteral* node) {
962fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  IndentedScope indent(this, "NATIVE FUNC LITERAL");
963fb7a7c4ffde9a4d060f5f989371e2ce964ee5831jkummerow@chromium.org  PrintLiteralIndented("NAME", node->name(), false);
96443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
96543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
96643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
96743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitConditional(Conditional* node) {
9687979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "CONDITIONAL");
96957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintIndentedVisit("CONDITION", node->condition());
97043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("THEN", node->then_expression());
97143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintIndentedVisit("ELSE", node->else_expression());
97243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
97343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
97443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
97557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org// TODO(svenpanne) Start with IndentedScope.
97643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitLiteral(Literal* node) {
9771510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  PrintLiteralIndented("LITERAL", node->value(), true);
97843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
97943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
98043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
98143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitRegExpLiteral(RegExpLiteral* node) {
9827979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "REGEXP LITERAL");
983e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  PrintLiteralIndented("PATTERN", node->pattern(), false);
984e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  PrintLiteralIndented("FLAGS", node->flags(), false);
98543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
98643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
98743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
98843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitObjectLiteral(ObjectLiteral* node) {
9897979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "OBJ LITERAL");
99043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  for (int i = 0; i < node->properties()->length(); i++) {
99143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    const char* prop_kind = NULL;
99243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    switch (node->properties()->at(i)->kind()) {
99343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      case ObjectLiteral::Property::CONSTANT:
99443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        prop_kind = "PROPERTY - CONSTANT";
99543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        break;
99643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      case ObjectLiteral::Property::COMPUTED:
99743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        prop_kind = "PROPERTY - COMPUTED";
99843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        break;
9990b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org      case ObjectLiteral::Property::MATERIALIZED_LITERAL:
10000b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org        prop_kind = "PROPERTY - MATERIALIZED_LITERAL";
10010b6db5975a9d1ebcf3de7b18603380d99f789e66sgjesse@chromium.org        break;
100243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      case ObjectLiteral::Property::PROTOTYPE:
100343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        prop_kind = "PROPERTY - PROTOTYPE";
100443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        break;
100543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      case ObjectLiteral::Property::GETTER:
100643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        prop_kind = "PROPERTY - GETTER";
100743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        break;
100843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      case ObjectLiteral::Property::SETTER:
100943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        prop_kind = "PROPERTY - SETTER";
101043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        break;
101143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      default:
101243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen        UNREACHABLE();
101343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
10147979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org    IndentedScope prop(this, prop_kind);
101543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintIndentedVisit("KEY", node->properties()->at(i)->key());
101643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintIndentedVisit("VALUE", node->properties()->at(i)->value());
101743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
101843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
101943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
102043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
102143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitArrayLiteral(ArrayLiteral* node) {
10227979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "ARRAY LITERAL");
102343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  if (node->values()->length() > 0) {
10247979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org    IndentedScope indent(this, "VALUES");
102543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    for (int i = 0; i < node->values()->length(); i++) {
102643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen      Visit(node->values()->at(i));
102743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    }
102843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
102943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
103043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
103143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
103257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org// TODO(svenpanne) Start with IndentedScope.
103343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitVariableProxy(VariableProxy* node) {
103443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Variable* var = node->var();
103583e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  EmbeddedVector<char, 128> buf;
103670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  int pos = SNPrintF(buf, "VAR PROXY");
103783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  switch (var->location()) {
103883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org    case Variable::UNALLOCATED:
103983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org      break;
104083e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org    case Variable::PARAMETER:
104170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org      SNPrintF(buf + pos, " parameter[%d]", var->index());
104283e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org      break;
104383e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org    case Variable::LOCAL:
104470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org      SNPrintF(buf + pos, " local[%d]", var->index());
104583e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org      break;
104683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org    case Variable::CONTEXT:
104770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org      SNPrintF(buf + pos, " context[%d]", var->index());
104883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org      break;
104983e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org    case Variable::LOOKUP:
105070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org      SNPrintF(buf + pos, " lookup");
105183e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org      break;
105243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
105383e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org  PrintLiteralWithModeIndented(buf.start(), var, node->name());
105443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
105543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
105643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
105743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitAssignment(Assignment* node) {
105857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, Token::Name(node->op()));
105943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->target());
106043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->value());
106143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
106243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
106343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
1064f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgvoid AstPrinter::VisitYield(Yield* node) {
106557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "YIELD");
106657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Visit(node->expression());
1067f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}
1068f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
1069f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
107043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitThrow(Throw* node) {
107157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "THROW");
107257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Visit(node->exception());
107343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
107443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
107543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
107643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitProperty(Property* node) {
107757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "PROPERTY");
107843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->obj());
107943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Literal* literal = node->key()->AsLiteral();
10801510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (literal != NULL && literal->value()->IsInternalizedString()) {
10811510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    PrintLiteralIndented("NAME", literal->value(), false);
108243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  } else {
108343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    PrintIndentedVisit("KEY", node->key());
108443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  }
108543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
108643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
108743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
108843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitCall(Call* node) {
10897979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "CALL");
109043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
109143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintArguments(node->arguments());
109243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
109343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
109543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitCallNew(CallNew* node) {
10967979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "CALL NEW");
109743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->expression());
109843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintArguments(node->arguments());
109943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
110043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
110143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
110243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitCallRuntime(CallRuntime* node) {
110357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, "CALL RUNTIME");
110457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  PrintLiteralIndented("NAME", node->name(), false);
110543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  PrintArguments(node->arguments());
110643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
110743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
110843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
110943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitUnaryOperation(UnaryOperation* node) {
111057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, Token::Name(node->op()));
111157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Visit(node->expression());
111243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
111343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
111443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
111543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitCountOperation(CountOperation* node) {
1116b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org  EmbeddedVector<char, 128> buf;
111770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  SNPrintF(buf, "%s %s", (node->is_prefix() ? "PRE" : "POST"),
111870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org           Token::Name(node->op()));
111957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, buf.start());
112057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Visit(node->expression());
112143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
112243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
112343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
112443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitBinaryOperation(BinaryOperation* node) {
112557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, Token::Name(node->op()));
112643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->left());
112743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->right());
112843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
112943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitCompareOperation(CompareOperation* node) {
113257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  IndentedScope indent(this, Token::Name(node->op()));
113343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->left());
113443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  Visit(node->right());
113543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
113643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
113843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid AstPrinter::VisitThisFunction(ThisFunction* node) {
11397979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  IndentedScope indent(this, "THIS-FUNCTION");
114043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}
114143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
114243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif  // DEBUG
114343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
114443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
1145