THRIFT-4334: Fix perl indentation for default attribute values of
array / hashes / objects
Client: Perl

This closes #1373
diff --git a/compiler/cpp/src/thrift/generate/t_perl_generator.cc b/compiler/cpp/src/thrift/generate/t_perl_generator.cc
index 12b8bfc..0bdbb05 100644
--- a/compiler/cpp/src/thrift/generate/t_perl_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_perl_generator.cc
@@ -356,6 +356,7 @@
   } else if (type->is_struct() || type->is_xception()) {
     out << "new " << perl_namespace(type->get_program()) << type->get_name() << "({" << endl;
     indent_up();
+
     const vector<t_field*>& fields = ((t_struct*)type)->get_members();
     vector<t_field*>::const_iterator f_iter;
     const map<t_const_value*, t_const_value*>& val = value->get_map();
@@ -370,29 +371,30 @@
       if (field_type == NULL) {
         throw "type error: " + type->get_name() + " has no field " + v_iter->first->get_string();
       }
-      out << render_const_value(g_type_string, v_iter->first);
+      indent(out) << render_const_value(g_type_string, v_iter->first);
       out << " => ";
       out << render_const_value(field_type, v_iter->second);
       out << ",";
       out << endl;
     }
-
-    out << "})";
+    indent_down();
+    indent(out) << "})";
   } else if (type->is_map()) {
     t_type* ktype = ((t_map*)type)->get_key_type();
     t_type* vtype = ((t_map*)type)->get_val_type();
     out << "{" << endl;
+    indent_up();
 
     const map<t_const_value*, t_const_value*>& val = value->get_map();
     map<t_const_value*, t_const_value*>::const_iterator v_iter;
     for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
-      out << render_const_value(ktype, v_iter->first);
+      indent(out) << render_const_value(ktype, v_iter->first);
       out << " => ";
       out << render_const_value(vtype, v_iter->second);
       out << "," << endl;
     }
-
-    out << "}";
+    indent_down();
+    indent(out) << "}";
   } else if (type->is_list() || type->is_set()) {
     t_type* etype;
     if (type->is_list()) {
@@ -401,17 +403,20 @@
       etype = ((t_set*)type)->get_elem_type();
     }
     out << "[" << endl;
+    indent_up();
+
     const vector<t_const_value*>& val = value->get_list();
     vector<t_const_value*>::const_iterator v_iter;
     for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
 
-      out << render_const_value(etype, *v_iter);
+      indent(out) << render_const_value(etype, *v_iter);
       if (type->is_set()) {
         out << " => 1";
       }
       out << "," << endl;
     }
-    out << "]";
+    indent_down();
+    indent(out) << "]";
   }
   return out.str();
 }