Reviewers: rjrjr,

Description:
Fixes issue where UiRenderer breaks when a field is referenced more than
once


Please review this at http://gwt-code-reviews.appspot.com/1525805/

Affected files:
  M user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
  M user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
  M user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java
  M user/test/com/google/gwt/uibinder/test/client/UiRendererUi.java
  M user/test/com/google/gwt/uibinder/test/client/UiRendererUi.ui.xml


Index: user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
===================================================================
--- user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java (revision 10533) +++ user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java (working copy)
@@ -374,7 +374,7 @@

     fieldWriter = fieldManager.registerField(
FieldWriterType.IMPORTED, matchingResourceType.getErasedType(), resourceName);
-    fieldWriter.setInitializer("this." + resourceName);
+ fieldWriter.setInitializer(UiBinderWriter.RENDER_PARAM_HOLDER_PREFIX + resourceName);
   }

private void createSingleImport(XMLElement elem, JClassType enclosingType,
Index: user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
===================================================================
--- user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java (revision 10533) +++ user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java (working copy)
@@ -66,6 +66,9 @@
  * Writer for UiBinder generated classes.
  */
 public class UiBinderWriter implements Statements {
+
+ static final String RENDER_PARAM_HOLDER_PREFIX = "_renderer_param_holder_";
+
   private static final String PACKAGE_URI_SCHEME = "urn:import:";

   // TODO(rjrjr) Another place that we need a general anonymous field
@@ -1749,7 +1752,8 @@
private void writeRenderParameterDefinitions(IndentedWriter w, JParameter[] renderParameters) {
     for (int i = 0; i < renderParameters.length; i++) {
       JParameter parameter = renderParameters[i];
- w.write("private %s %s;", parameter.getType().getQualifiedSourceName(), parameter.getName()); + w.write("private %s %s%s;", parameter.getType().getQualifiedSourceName(),
+          RENDER_PARAM_HOLDER_PREFIX, parameter.getName());
       w.newline();
     }
   }
@@ -1757,7 +1761,7 @@
private void writeRenderParameterInitializers(IndentedWriter w, JParameter[] renderParameters) {
     for (int i = 0; i < renderParameters.length; i++) {
       JParameter parameter = renderParameters[i];
-      w.write("this.%s = %s;", parameter.getName(), parameter.getName());
+ w.write("%s%s = %s;", RENDER_PARAM_HOLDER_PREFIX, parameter.getName(), parameter.getName());
       w.newline();
     }
   }
Index: user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java
===================================================================
--- user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java (revision 10533) +++ user/test/com/google/gwt/uibinder/test/client/UiRendererTest.java (working copy)
@@ -30,6 +30,7 @@
 public class UiRendererTest extends GWTTestCase {

   private static final String RENDERED_VALUE = "bar";
+  private static final String RENDERED_VALUE_TWICE = "quux";

   private DivElement docDiv;
   private SafeHtml renderedHtml;
@@ -46,7 +47,7 @@
     super.gwtSetUp();
     UiRendererTestApp app = UiRendererTestApp.getInstance();
     safeHtmlUi = app.getSafeHtmlUi();
-    renderedHtml = safeHtmlUi.render(RENDERED_VALUE);
+    renderedHtml = safeHtmlUi.render(RENDERED_VALUE, RENDERED_VALUE_TWICE);
     renderer = safeHtmlUi.getRenderer();

     docDiv = Document.get().createDivElement();
@@ -66,7 +67,7 @@

     // Get nameSpan
     SpanElement nameSpan = renderer.getNameSpan(docDiv);
-    assertSpanContainsRenderedValueText(nameSpan.getFirstChild());
+ assertSpanContainsRenderedValueText(RENDERED_VALUE, nameSpan.getFirstChild());

     // Getters also work from the root element
     DivElement root2 = renderer.getRoot(root);
@@ -74,7 +75,7 @@
     assertNotNull(root2);
     assertSpanContainsRenderedValue(root2);
     nameSpan = renderer.getNameSpan(root);
-    assertSpanContainsRenderedValueText(nameSpan.getFirstChild());
+ assertSpanContainsRenderedValueText(RENDERED_VALUE, nameSpan.getFirstChild());
   }

   public void testFieldGettersDetachedRoot() {
@@ -197,7 +198,7 @@
       // In prod mode we avoid checking for being the only child
       assertTrue(renderer.isParentOrRenderer(docDiv));
       SpanElement nameSpan = renderer.getNameSpan(docDiv);
-      assertSpanContainsRenderedValueText(nameSpan.getFirstChild());
+ assertSpanContainsRenderedValueText(RENDERED_VALUE, nameSpan.getFirstChild());
     } else {
       // in dev mode an explicit check is made
       assertFalse(renderer.isParentOrRenderer(docDiv));
@@ -237,6 +238,14 @@
     assertEquals(Node.ELEMENT_NODE, spanNode.getNodeType());
     assertEquals("span", spanNode.getNodeName().toLowerCase());
     assertFalse(spanNode.hasChildNodes());
+
+    // Field passed to render() and used twice was rendered correctly too
+    Node spanNode2 = innerDiv.getChild(5);
+    assertEquals(Node.ELEMENT_NODE, spanNode2.getNodeType());
+    assertEquals("span", spanNode2.getNodeName().toLowerCase());
+    assertTrue(spanNode2.hasChildNodes());
+ assertSpanContainsRenderedValueText(RENDERED_VALUE_TWICE + RENDERED_VALUE_TWICE,
+        spanNode2.getFirstChild());
   }

   @Override
@@ -251,11 +260,11 @@
     assertEquals("span", firstFieldNode.getNodeName().toLowerCase());
     assertTrue(firstFieldNode.hasChildNodes());
     Node renderedValue = firstFieldNode.getFirstChild();
-    assertSpanContainsRenderedValueText(renderedValue);
-  }
-
-  private void assertSpanContainsRenderedValueText(Node renderedValue) {
+    assertSpanContainsRenderedValueText(RENDERED_VALUE, renderedValue);
+  }
+
+ private void assertSpanContainsRenderedValueText(String expectedValue, Node renderedValue) {
     assertEquals(Node.TEXT_NODE, renderedValue.getNodeType());
-    assertEquals(RENDERED_VALUE, renderedValue.getNodeValue());
+    assertEquals(expectedValue, renderedValue.getNodeValue());
   }
 }
Index: user/test/com/google/gwt/uibinder/test/client/UiRendererUi.java
===================================================================
--- user/test/com/google/gwt/uibinder/test/client/UiRendererUi.java (revision 10533) +++ user/test/com/google/gwt/uibinder/test/client/UiRendererUi.java (working copy)
@@ -72,7 +72,7 @@
     Element getTmElement(Element owner);
     TableRowElement getTr(Element owner);

-    void render(SafeHtmlBuilder sb, Foo aValue);
+    void render(SafeHtmlBuilder sb, Foo aValue, Foo aValueTwice);
   }

private static final HtmlRenderer renderer = GWT.create(HtmlRenderer.class);
@@ -84,9 +84,9 @@
   public UiRendererUi() {
   }

-  public SafeHtml render(String value) {
+  public SafeHtml render(String value, String valueTwice) {
     SafeHtmlBuilder sb = new SafeHtmlBuilder();
-    getRenderer().render(sb, new Foo(value));
+    getRenderer().render(sb, new Foo(value), new Foo(valueTwice));
     return sb.toSafeHtml();
   }
 }
Index: user/test/com/google/gwt/uibinder/test/client/UiRendererUi.ui.xml
===================================================================
--- user/test/com/google/gwt/uibinder/test/client/UiRendererUi.ui.xml (revision 10533) +++ user/test/com/google/gwt/uibinder/test/client/UiRendererUi.ui.xml (working copy)
@@ -17,13 +17,14 @@
   >
<ui:with field="constants" type="com.google.gwt.uibinder.test.client.Constants"/>
   <ui:with field="aValue"/>
+  <ui:with field="aValueTwice"/>
   <div ui:field='root' res:class="style.bodyColor style.bodyFont"
       title="The title of this div is localizable">
     <ui:attribute name='title'/>
     <span><ui:text from="{constants.getText}" /></span>
Hello, <span ui:field="nameSpan"><ui:text from="{aValue.getBar}"/></span>.
     <ui:msg>How goes it?</ui:msg>
-    <span/>
+ <span/><span><ui:text from="{aValueTwice.getBar}{aValueTwice.getBar}"/></span> <h2 res:class="style.bodyColor style.bodyFont">Placeholders in localizables</h2> <p><ui:msg>When you mark up your text for translation, there will be bits
       that you don't want the translators to mess with. You can protect


--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to