Reviewed by Eric.
[WebKit-https.git] / JavaScriptCore / kjs / nodes2string.cpp
index d4f00636c2c7466be7c88629d4f6f6c003d85925..577ea6955e3cc75a1eb47b577367c609db15c2ea 100644 (file)
@@ -707,21 +707,21 @@ void CommaNode::streamTo(SourceStream& s) const
     s << PrecAssignment << expr1 << ", " << PrecAssignment << expr2;
 }
 
-void AssignExprNode::streamTo(SourceStream& s) const
+void ConstDeclNode::streamTo(SourceStream& s) const
 {
-    s << " = " << PrecAssignment << expr;
-}
-
-void VarDeclNode::streamTo(SourceStream& s) const
-{
-    s << "var " << ident << init;
-    for (VarDeclNode* n = next.get(); n; n = n->next.get())
-        s << ", " << ident << init;
+    s << ident;
+    if (init)
+        s << " = " << init;
+    for (ConstDeclNode* n = next.get(); n; n = n->next.get()) {
+        s << ", " << ident;
+        if (init)
+            s << " = " << init;
+    }
 }
 
-void VarStatementNode::streamTo(SourceStream& s) const
+void ConstStatementNode::streamTo(SourceStream& s) const
 {
-    s << Endl << next << ';';
+    s << Endl << "const " << next << ';';
 }
 
 static inline void statementListStreamTo(const Vector<RefPtr<StatementNode> >& nodes, SourceStream& s)
@@ -737,6 +737,28 @@ void BlockNode::streamTo(SourceStream& s) const
     s << Unindent << Endl << "}";
 }
 
+void ScopeNode::streamTo(SourceStream& s) const
+{
+    s << Endl << "{" << Indent;
+
+    bool printedVar = false;
+    for (size_t i = 0; i < m_varStack.size(); ++i) {
+        if (m_varStack[i].second == 0) {
+            if (!printedVar) {
+                s << Endl << "var ";
+                printedVar = true;
+            } else
+                s << ", ";
+            s << m_varStack[i].first;
+        }
+    }
+    if (printedVar)
+        s << ';';
+
+    statementListStreamTo(m_children, s); 
+    s << Unindent << Endl << "}";
+}
+
 void EmptyStatementNode::streamTo(SourceStream& s) const
 {
     s << Endl << ';';
@@ -747,6 +769,11 @@ void ExprStatementNode::streamTo(SourceStream& s) const
     s << Endl << expr << ';';
 }
 
+void VarStatementNode::streamTo(SourceStream& s) const
+{
+    s << Endl << "var " << expr << ';';
+}
+
 void IfNode::streamTo(SourceStream& s) const
 {
     s << Endl << "if (" << m_condition << ')' << Indent << m_ifBlock << Unindent;
@@ -772,6 +799,7 @@ void WhileNode::streamTo(SourceStream& s) const
 void ForNode::streamTo(SourceStream& s) const
 {
     s << Endl << "for ("
+        << (expr1WasVarDecl ? "var " : "")
         << expr1
         << "; " << expr2
         << "; " << expr3
@@ -781,9 +809,13 @@ void ForNode::streamTo(SourceStream& s) const
 void ForInNode::streamTo(SourceStream& s) const
 {
     s << Endl << "for (";
-    if (varDecl)
-        s << varDecl;
-    else
+    if (identIsVarDecl) {
+        s << "var ";
+        if (init)
+            s << init;
+        else
+            s << PrecLeftHandSide << lexpr;
+    } else
         s << PrecLeftHandSide << lexpr;
 
     s << " in " << expr << ')' << Indent << statement << Unindent;