JsNew's constructor target expression should be immutable.

http://gwt-code-reviews.appspot.com/154806/show
Review by: cromwellian


git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@7637 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
index 6e42209..58d86ac 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/GenerateJavaScriptAST.java
@@ -1102,9 +1102,8 @@
 
     @Override
     public void endVisit(JNewInstance x, Context ctx) {
-      JsNew newOp = new JsNew(x.getSourceInfo());
       JsNameRef nameRef = names.get(x.getClassType()).makeRef(x.getSourceInfo());
-      newOp.setConstructorExpression(nameRef);
+      JsNew newOp = new JsNew(x.getSourceInfo(), nameRef);
       push(newOp);
     }
 
@@ -1600,10 +1599,9 @@
         lhs.setQualifier(seedFuncName.makeRef(sourceInfo));
         JsExpression rhs;
         if (x.getSuperClass() != null) {
-          JsNew newExpr = new JsNew(sourceInfo);
           JsNameRef superPrototypeRef = names.get(x.getSuperClass()).makeRef(
               sourceInfo);
-          newExpr.setConstructorExpression(superPrototypeRef);
+          JsNew newExpr = new JsNew(sourceInfo, superPrototypeRef);
           rhs = newExpr;
         } else {
           rhs = new JsObjectLiteral(sourceInfo);
diff --git a/dev/core/src/com/google/gwt/dev/js/JsHoister.java b/dev/core/src/com/google/gwt/dev/js/JsHoister.java
index 0faadde..15113e9 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsHoister.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsHoister.java
@@ -39,6 +39,7 @@
 import com.google.gwt.dev.js.ast.JsThisRef;
 import com.google.gwt.dev.js.ast.JsVisitor;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Stack;
 
@@ -151,14 +152,13 @@
 
     @Override
     public void endVisit(JsNew x, JsContext<JsExpression> ctx) {
-      JsNew toReturn = new JsNew(x.getSourceInfo());
-
-      List<JsExpression> arguments = toReturn.getArguments();
       int size = x.getArguments().size();
+      List<JsExpression> arguments = new ArrayList<JsExpression>(size);
       while (size-- > 0) {
         arguments.add(0, stack.pop());
       }
-      toReturn.setConstructorExpression(stack.pop());
+      JsNew toReturn = new JsNew(x.getSourceInfo(), stack.pop());
+      toReturn.getArguments().addAll(arguments);
       stack.push(toReturn);
     }
 
diff --git a/dev/core/src/com/google/gwt/dev/js/JsParser.java b/dev/core/src/com/google/gwt/dev/js/JsParser.java
index 7fdde5b..0e5d5ce 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsParser.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsParser.java
@@ -807,14 +807,12 @@
   }
 
   private JsNew mapNew(Node newNode) throws JsParserException {
-
-    JsNew newExpr = new JsNew(makeSourceInfo(newNode));
-
     // Map the constructor expression, which is often just the name of
     // some lambda.
     //
     Node fromCtorExpr = newNode.getFirstChild();
-    newExpr.setConstructorExpression(mapExpression(fromCtorExpr));
+    JsNew newExpr = new JsNew(makeSourceInfo(newNode),
+        mapExpression(fromCtorExpr));
 
     // Iterate over and map the arguments.
     //
diff --git a/dev/core/src/com/google/gwt/dev/js/ast/JsNew.java b/dev/core/src/com/google/gwt/dev/js/ast/JsNew.java
index 19f8a51..159a6a4 100644
--- a/dev/core/src/com/google/gwt/dev/js/ast/JsNew.java
+++ b/dev/core/src/com/google/gwt/dev/js/ast/JsNew.java
@@ -29,8 +29,9 @@
 
   private JsExpression ctorExpr;
 
-  public JsNew(SourceInfo sourceInfo) {
+  public JsNew(SourceInfo sourceInfo, JsExpression ctorExpr) {
     super(sourceInfo);
+    this.ctorExpr = ctorExpr;
   }
 
   public List<JsExpression> getArguments() {
@@ -58,10 +59,6 @@
     return false;
   }
 
-  public void setConstructorExpression(JsExpression ctorExpr) {
-    this.ctorExpr = ctorExpr;
-  }
-
   public void traverse(JsVisitor v, JsContext<JsExpression> ctx) {
     if (v.visit(this, ctx)) {
       ctorExpr = v.accept(ctorExpr);