Improve the way a FuncallExpression is printed while debugging.

--
MOS_MIGRATED_REVID=93908545
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
index bdc0fb6..1287fc7 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/EvalUtils.java
@@ -398,7 +398,7 @@
     }
   }
 
-  private static void printList(Iterable<?> list,
+  public static void printList(Iterable<?> list,
       String before, String separator, String after, String singletonTerminator, Appendable buffer)
       throws IOException {
     boolean printSeparator = false; // don't print the separator before the first element
@@ -418,7 +418,7 @@
     buffer.append(after);
   }
 
-  private static void printList(Iterable<?> list, boolean isTuple, Appendable buffer)
+  public static void printList(Iterable<?> list, boolean isTuple, Appendable buffer)
       throws IOException {
     if (isTuple) {
       printList(list, "(", ", ", ")", ",", buffer);
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
index b996588..5a04ba1 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
@@ -26,6 +26,7 @@
 import com.google.devtools.build.lib.syntax.EvalException.EvalExceptionWithJavaCause;
 import com.google.devtools.build.lib.util.StringUtilities;
 
+import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
@@ -254,10 +255,17 @@
     if (func.getName().equals("$index")) {
       return obj + "[" + args.get(0) + "]";
     }
+    StringBuilder sb = new StringBuilder();
     if (obj != null) {
-      return obj + "." + func + "(" + args + ")";
+      sb.append(obj).append(".");
     }
-    return func + "(" + args + ")";
+    sb.append(func);
+    try {
+      EvalUtils.printList(args, "(", ", ", ")", null, sb);
+    } catch (IOException x) {
+      throw new RuntimeException("Error while printing", x);
+    }
+    return sb.toString();
   }
 
   /**
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
index e5d4815..ef1b9f9 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ParserTest.java
@@ -392,8 +392,8 @@
   public void testPrettyPrintFunctions() throws Exception {
     assertEquals("[x[1:3]\n]", parseFile("x[1:3]").toString());
     assertEquals("[str[42]\n]", parseFile("str[42]").toString());
-    assertEquals("[ctx.new_file(['hello'])\n]", parseFile("ctx.new_file('hello')").toString());
-    assertEquals("[new_file(['hello'])\n]", parseFile("new_file('hello')").toString());
+    assertEquals("[ctx.new_file('hello')\n]", parseFile("ctx.new_file('hello')").toString());
+    assertEquals("[new_file('hello')\n]", parseFile("new_file('hello')").toString());
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/ValidationTests.java b/src/test/java/com/google/devtools/build/lib/syntax/ValidationTests.java
index fbbdbcc..3326fec 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/ValidationTests.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/ValidationTests.java
@@ -180,7 +180,7 @@
 
   @Test
   public void testFuncReturningDictAssignmentAsLValue() throws Exception {
-    checkError("can only assign to variables and tuples, not to 'dict([])['b']'",
+    checkError("can only assign to variables and tuples, not to 'dict()['b']'",
         "def dict():",
         "  return {'a': 1}",
         "def func():",