diff --git a/src/com/google/javascript/jscomp/CodeGenerator.java b/src/com/google/javascript/jscomp/CodeGenerator.java
index <HASH>..<HASH> 100644
--- a/src/com/google/javascript/jscomp/CodeGenerator.java
+++ b/src/com/google/javascript/jscomp/CodeGenerator.java
@@ -436,7 +436,7 @@ public class CodeGenerator {
       case ITER_SPREAD:
       case OBJECT_SPREAD:
         add("...");
-        add(node.getFirstChild());
+        addExpr(first, NodeUtil.precedence(type), Context.OTHER);
         break;
 
       case EXPORT:
diff --git a/test/com/google/javascript/jscomp/CodePrinterTest.java b/test/com/google/javascript/jscomp/CodePrinterTest.java
index <HASH>..<HASH> 100644
--- a/test/com/google/javascript/jscomp/CodePrinterTest.java
+++ b/test/com/google/javascript/jscomp/CodePrinterTest.java
@@ -3034,6 +3034,7 @@ public final class CodePrinterTest extends CodePrinterTestBase {
     assertPrintSame("f(...args)");
     assertPrintSame("f(...arrayOfArrays[0])");
     assertPrintSame("f(...[1,2,3])");
+    assertPrintSame("f(...([1],[2]))");
   }
 
   @Test
Preserve parentheses on spread operator's AssignmentExpression