Small fix to CellPanelParser to make it work with lazy widget
binder. Unsmall refactoring to eliminate use of the method that
allowed CellPanelParser to screw things up in the first place.
In more detail: UiBinderWriter.parseElementToField() now returns a
FieldWriter instead of a string. Parsers must call
FieldWriter.getNextReference() whenever they want to generate a call
to the field, so they don't break reference counting.
Review at http://gwt-code-reviews.appspot.com/1577803
Review by: rchandia@google.com
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10716 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/AbsolutePanelParser.java b/user/src/com/google/gwt/uibinder/elementparsers/AbsolutePanelParser.java
index a975035..47b0648 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/AbsolutePanelParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/AbsolutePanelParser.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
@@ -40,16 +41,16 @@
String top = child.consumeRequiredIntAttribute("top");
// Add child widget.
XMLElement widgetElem = child.consumeSingleChildElement();
- String widgetFieldName = writer.parseElementToField(widgetElem);
+ FieldWriter widgetField = writer.parseElementToField(widgetElem);
writer.addStatement("%1$s.add(%2$s, %3$s, %4$s);", fieldName,
- widgetFieldName, left, top);
+ widgetField.getNextReference(), left, top);
continue;
}
// Parse Widget.
if (writer.isWidgetElement(child)) {
- String widgetFieldName = writer.parseElementToField(child);
- writer.addStatement("%1$s.add(%2$s);", fieldName, widgetFieldName);
+ FieldWriter widgetFieldName = writer.parseElementToField(child);
+ writer.addStatement("%1$s.add(%2$s);", fieldName, widgetFieldName.getNextReference());
continue;
}
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/CellPanelParser.java b/user/src/com/google/gwt/uibinder/elementparsers/CellPanelParser.java
index 21d0eb0..ef18b3c 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/CellPanelParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/CellPanelParser.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
import com.google.gwt.user.client.ui.HasHorizontalAlignment.HorizontalAlignmentConstant;
@@ -41,8 +42,8 @@
*
* @throws UnableToCompleteException
*/
- static void parseCellAttributes(XMLElement cellElem, String fieldName,
- String childFieldName, UiBinderWriter writer)
+ protected static void parseCellAttributes(XMLElement cellElem, String fieldName,
+ FieldWriter childField, UiBinderWriter writer)
throws UnableToCompleteException {
JClassType hAlignConstantType = writer.getOracle().findType(
HorizontalAlignmentConstant.class.getCanonicalName());
@@ -53,26 +54,26 @@
if (cellElem.hasAttribute(HALIGN_ATTR)) {
String value = cellElem.consumeAttribute(HALIGN_ATTR, hAlignConstantType);
writer.addStatement("%1$s.setCellHorizontalAlignment(%2$s, %3$s);",
- fieldName, childFieldName, value);
+ fieldName, childField.getNextReference(), value);
}
if (cellElem.hasAttribute(VALIGN_ATTR)) {
String value = cellElem.consumeAttribute(VALIGN_ATTR, vAlignConstantType);
writer.addStatement("%1$s.setCellVerticalAlignment(%2$s, %3$s);",
- fieldName, childFieldName, value);
+ fieldName, childField.getNextReference(), value);
}
// Parse width and height attributes.
if (cellElem.hasAttribute(WIDTH_ATTR)) {
String value = cellElem.consumeStringAttribute(WIDTH_ATTR);
writer.addStatement("%1$s.setCellWidth(%2$s, %3$s);", fieldName,
- childFieldName, value);
+ childField.getNextReference(), value);
}
if (cellElem.hasAttribute(HEIGHT_ATTR)) {
String value = cellElem.consumeStringAttribute(HEIGHT_ATTR);
writer.addStatement("%1$s.setCellHeight(%2$s, %3$s);", fieldName,
- childFieldName, value);
+ childField.getNextReference(), value);
}
}
@@ -86,19 +87,19 @@
&& localTagNameIsCell(tagName)) {
// It's a cell element, so parse its single child as a widget.
XMLElement widget = child.consumeSingleChildElement();
- String childFieldName = writer.parseElementToField(widget);
- writer.addStatement("%1$s.add(%2$s);", fieldName, childFieldName);
+ FieldWriter childField = writer.parseElementToField(widget);
+ writer.addStatement("%1$s.add(%2$s);", fieldName, childField.getNextReference());
// Parse the cell tag's alignment & size attributes.
- parseCellAttributes(child, fieldName, childFieldName, writer);
+ parseCellAttributes(child, fieldName, childField, writer);
} else {
if (!writer.isWidgetElement(child)) {
writer.die(elem, "Expected a widget or <%s:%s>, found %s",
elem.getPrefix(), CELL_TAG.toLowerCase(), child);
}
// It's just a normal child, so parse it as a widget.
- String childFieldName = writer.parseElementToField(child);
- writer.addStatement("%1$s.add(%2$s);", fieldName, childFieldName);
+ FieldWriter childField = writer.parseElementToField(child);
+ writer.addStatement("%1$s.add(%2$s);", fieldName, childField.getNextReference());
}
}
}
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/DialogBoxParser.java b/user/src/com/google/gwt/uibinder/elementparsers/DialogBoxParser.java
index e4367d4..fc4859d 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/DialogBoxParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/DialogBoxParser.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
import com.google.gwt.user.client.ui.DialogBox;
@@ -35,7 +36,7 @@
UiBinderWriter writer) throws UnableToCompleteException {
String caption = null;
- String body = null;
+ FieldWriter body = null;
XMLElement customCaption = null;
String prefix = elem.getPrefix();
@@ -60,7 +61,7 @@
} else {
if (body != null) {
writer.die(elem, "May have only one widget, but found %s and %s",
- body, child);
+ body.getName(), child);
}
if (!writer.isWidgetElement(child)) {
writer.die(elem, "Found non-widget %s", child);
@@ -81,7 +82,7 @@
writer.declareTemplateCall(caption, fieldName));
}
if (body != null) {
- writer.addStatement("%s.setWidget(%s);", fieldName, body);
+ writer.addStatement("%s.setWidget(%s);", fieldName, body.getNextReference());
}
}
@@ -130,10 +131,10 @@
customCaption.getPrefix(), CUSTOM_CAPTION,
Caption.class.getCanonicalName());
}
- String fieldElement = writer.parseElementToField(customCaption);
+ FieldWriter fieldElement = writer.parseElementToField(customCaption);
writer.setFieldInitializerAsConstructor(fieldName,
- autoHide, modal, fieldElement);
+ autoHide, modal, fieldElement.getNextReference());
} else {
writer.setFieldInitializerAsConstructor(fieldName, autoHide, modal);
}
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/DisclosurePanelParser.java b/user/src/com/google/gwt/uibinder/elementparsers/DisclosurePanelParser.java
index 6be5592..f8b32e5 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/DisclosurePanelParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/DisclosurePanelParser.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
@@ -46,8 +47,8 @@
writer.die(children.body, "Must be a widget");
}
- String bodyField = writer.parseElementToField(children.body);
- writer.addStatement("%s.add(%s);", panelField, bodyField);
+ FieldWriter bodyField = writer.parseElementToField(children.body);
+ writer.addStatement("%s.add(%s);", panelField, bodyField.getNextReference());
}
if (children.customHeader != null) {
@@ -57,8 +58,8 @@
writer.die(headerElement, "Must be a widget");
}
- String headerField = writer.parseElementToField(headerElement);
- writer.addStatement("%s.setHeader(%s);", panelField, headerField);
+ FieldWriter headerField = writer.parseElementToField(headerElement);
+ writer.addStatement("%s.setHeader(%s);", panelField, headerField.getNextReference());
}
if (children.header != null) {
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/DockLayoutPanelParser.java b/user/src/com/google/gwt/uibinder/elementparsers/DockLayoutPanelParser.java
index 7b98f84..7e5e6c9 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/DockLayoutPanelParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/DockLayoutPanelParser.java
@@ -20,6 +20,7 @@
import com.google.gwt.core.ext.typeinfo.JEnumType;
import com.google.gwt.core.ext.typeinfo.NotFoundException;
import com.google.gwt.dom.client.Style.Unit;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
import com.google.gwt.user.client.ui.SplitLayoutPanel;
@@ -91,17 +92,17 @@
writer.die(elem, "%s must contain a widget, but found %s", child,
widget);
}
- String widgetName = writer.parseElementToField(widget);
+ FieldWriter widgetField = writer.parseElementToField(widget);
if (child.getLocalName().equals("center")) {
if (center != null) {
writer.die(elem, "Only one <%s:center> is allowed", elem.getPrefix());
}
- center = new CenterChild(child, widgetName);
+ center = new CenterChild(child, widgetField.getNextReference());
} else {
String size = child.consumeRequiredDoubleAttribute("size");
writer.addStatement("%s.%s(%s, %s);", fieldName, addMethodName(child),
- widgetName, size);
+ widgetField.getNextReference(), size);
}
}
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/DockPanelParser.java b/user/src/com/google/gwt/uibinder/elementparsers/DockPanelParser.java
index 7e66ece..9db4cfa 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/DockPanelParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/DockPanelParser.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
@@ -68,11 +69,12 @@
// And they can only have a single child widget.
XMLElement widget = child.consumeSingleChildElement();
- String childFieldName = writer.parseElementToField(widget);
- writer.addStatement("%1$s.add(%2$s, %3$s);", fieldName, childFieldName, translated);
+ FieldWriter childField = writer.parseElementToField(widget);
+ writer.addStatement("%1$s.add(%2$s, %3$s);", fieldName,
+ childField.getNextReference(), translated);
// Parse the CellPanel-specific attributes on the Dock element.
- CellPanelParser.parseCellAttributes(child, fieldName, childFieldName, writer);
+ CellPanelParser.parseCellAttributes(child, fieldName, childField, writer);
}
}
}
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/GridParser.java b/user/src/com/google/gwt/uibinder/elementparsers/GridParser.java
index 33254ab..2f4fd5f 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/GridParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/GridParser.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
@@ -172,8 +173,9 @@
newColumn = new CellContent(tagName, html, styleName);
}
if (tagName.equals(CUSTOMCELL_TAG)) {
- newColumn = new CellContent(tagName,
- writer.parseElementToField(cell.consumeSingleChildElement()), styleName);
+ FieldWriter field = writer.parseElementToField(cell.consumeSingleChildElement());
+ newColumn = new CellContent(tagName, field.getNextReference(),
+ styleName);
}
row.addColumn(newColumn);
}
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/HasTreeItemsParser.java b/user/src/com/google/gwt/uibinder/elementparsers/HasTreeItemsParser.java
index 18bca99..22d6eae 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/HasTreeItemsParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/HasTreeItemsParser.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
import com.google.gwt.user.client.ui.IsWidget;
@@ -43,15 +44,18 @@
// TreeItem+
if (itemType.isAssignableFrom(childType)) {
- String childFieldName = writer.parseElementToField(child);
- writer.addStatement("%1$s.addItem(%2$s);", fieldName, childFieldName);
+ FieldWriter childField = writer.parseElementToField(child);
+ writer.addStatement("%1$s.addItem(%2$s);", fieldName,
+ childField.getNextReference());
continue;
}
// Widget+ or IsWidget+
- if (widgetType.isAssignableFrom(childType) || isWidgetType.isAssignableFrom(childType)) {
- String childFieldName = writer.parseElementToField(child);
- writer.addStatement("%1$s.addItem(%2$s);", fieldName, childFieldName);
+ if (widgetType.isAssignableFrom(childType)
+ || isWidgetType.isAssignableFrom(childType)) {
+ FieldWriter childField = writer.parseElementToField(child);
+ writer.addStatement("%1$s.addItem(%2$s);", fieldName,
+ childField.getNextReference());
continue;
}
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/HasWidgetsParser.java b/user/src/com/google/gwt/uibinder/elementparsers/HasWidgetsParser.java
index 7e7ed80..419158d 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/HasWidgetsParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/HasWidgetsParser.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
@@ -35,8 +36,9 @@
if (!writer.isWidgetElement(child)) {
writer.die(child, "Expecting only widgets in %s", elem);
}
- String childFieldName = writer.parseElementToField(child);
- writer.addStatement("%1$s.add(%2$s);", fieldName, childFieldName);
+ FieldWriter childField = writer.parseElementToField(child);
+ writer.addStatement("%1$s.add(%2$s);", fieldName,
+ childField.getNextReference());
}
}
}
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/HtmlInterpreter.java b/user/src/com/google/gwt/uibinder/elementparsers/HtmlInterpreter.java
index b75ac48..83ed484 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/HtmlInterpreter.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/HtmlInterpreter.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.safehtml.shared.SafeHtml;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLAttribute;
import com.google.gwt.uibinder.rebind.XMLElement;
@@ -124,8 +125,8 @@
public String interpretElement(XMLElement elem) throws UnableToCompleteException {
if (writer.useLazyWidgetBuilders() && writer.isElementAssignableTo(elem, SafeHtml.class)) {
- String childFieldName = writer.parseElementToField(elem);
- return writer.tokenForSafeHtmlExpression(elem, childFieldName);
+ FieldWriter childField = writer.parseElementToField(elem);
+ return writer.tokenForSafeHtmlExpression(elem, childField.getNextReference());
}
if (writer.isImportedElement(elem)) {
writer.die(elem, "Not allowed in an HTML context");
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/IsRenderableInterpreter.java b/user/src/com/google/gwt/uibinder/elementparsers/IsRenderableInterpreter.java
index 05ff6fc..1583ce9 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/IsRenderableInterpreter.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/IsRenderableInterpreter.java
@@ -47,7 +47,7 @@
String stamper = uiWriter.declareRenderableStamper();
FieldManager fieldManager = uiWriter.getFieldManager();
FieldWriter fieldWriter = fieldManager.require(fieldName);
- FieldWriter childFieldWriter = uiWriter.parseElementToFieldWriter(elem);
+ FieldWriter childFieldWriter = uiWriter.parseElementToField(elem);
fieldWriter.addAttachStatement(
"%s.claimElement(%s.findStampedElement());",
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/LayoutPanelParser.java b/user/src/com/google/gwt/uibinder/elementparsers/LayoutPanelParser.java
index a75209d..5fcc2d2 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/LayoutPanelParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/LayoutPanelParser.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
@@ -43,8 +44,8 @@
}
// Get the child widget element.
- String childFieldName = writer.parseElementToField(layerElem.consumeSingleChildElement());
- writer.addStatement("%1$s.add(%2$s);", fieldName, childFieldName);
+ FieldWriter childField = writer.parseElementToField(layerElem.consumeSingleChildElement());
+ writer.addStatement("%1$s.add(%2$s);", fieldName, childField.getNextReference());
// Parse the horizontal layout constraints.
String left = layerElem.consumeLengthAttribute("left");
@@ -59,17 +60,17 @@
if (width != null) {
writer.die(layerElem, ERR_TOO_MANY, "horizontal");
}
- generateConstraint(fieldName, childFieldName, "LeftRight", left,
+ generateConstraint(fieldName, childField.getNextReference(), "LeftRight", left,
right, writer);
} else if (width != null) {
- generateConstraint(fieldName, childFieldName, "LeftWidth", left,
+ generateConstraint(fieldName, childField.getNextReference(), "LeftWidth", left,
width, writer);
} else {
writer.die(layerElem, ERR_PAIRING, "left", "right", "width");
}
} else if (right != null) {
if (width != null) {
- generateConstraint(fieldName, childFieldName, "RightWidth", right,
+ generateConstraint(fieldName, childField.getNextReference(), "RightWidth", right,
width, writer);
} else {
writer.die(layerElem, ERR_PAIRING, "right", "left", "width");
@@ -89,17 +90,17 @@
if (height != null) {
writer.die(layerElem, ERR_TOO_MANY, "vertical");
}
- generateConstraint(fieldName, childFieldName, "TopBottom", top,
+ generateConstraint(fieldName, childField.getNextReference(), "TopBottom", top,
bottom, writer);
} else if (height != null) {
- generateConstraint(fieldName, childFieldName, "TopHeight", top,
+ generateConstraint(fieldName, childField.getNextReference(), "TopHeight", top,
height, writer);
} else {
writer.die(layerElem, ERR_PAIRING, "top", "bottom", "height");
}
} else if (bottom != null) {
if (height != null) {
- generateConstraint(fieldName, childFieldName, "BottomHeight", bottom,
+ generateConstraint(fieldName, childField.getNextReference(), "BottomHeight", bottom,
height, writer);
} else {
writer.die(layerElem, ERR_PAIRING, "bottom", "top", "height");
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/LazyPanelParser.java b/user/src/com/google/gwt/uibinder/elementparsers/LazyPanelParser.java
index 96a36a8..886f601 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/LazyPanelParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/LazyPanelParser.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
import com.google.gwt.user.client.ui.LazyPanel;
@@ -45,13 +46,13 @@
writer.die(child, "Expecting only widgets in %s", elem);
}
- String childFieldName = writer.parseElementToField(child);
+ FieldWriter childField = writer.parseElementToField(child);
String lazyPanelClassPath = LazyPanel.class.getName();
String widgetClassPath = Widget.class.getName();
- String code = String.format(
- INITIALIZER_FORMAT, lazyPanelClassPath, widgetClassPath, childFieldName);
+ String code = String.format(INITIALIZER_FORMAT, lazyPanelClassPath,
+ widgetClassPath, childField.getNextReference());
writer.setFieldInitializer(fieldName, code);
}
}
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/MenuBarParser.java b/user/src/com/google/gwt/uibinder/elementparsers/MenuBarParser.java
index b63c9f7..db9a223 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/MenuBarParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/MenuBarParser.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
import com.google.gwt.user.client.ui.MenuBar;
@@ -51,16 +52,15 @@
// MenuItem+
if (itemType.isAssignableFrom(childType)) {
- String childFieldName = writer.parseElementToField(child);
- writer.addStatement("%1$s.addItem(%2$s);", fieldName, childFieldName);
+ FieldWriter childField = writer.parseElementToField(child);
+ writer.addStatement("%1$s.addItem(%2$s);", fieldName, childField.getNextReference());
continue;
}
// MenuItemSeparator+
if (separatorType.isAssignableFrom(childType)) {
- String childFieldName = writer.parseElementToField(child);
- writer.addStatement("%1$s.addSeparator(%2$s);", fieldName,
- childFieldName);
+ FieldWriter childField = writer.parseElementToField(child);
+ writer.addStatement("%1$s.addSeparator(%2$s);", fieldName, childField.getNextReference());
continue;
}
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/MenuItemParser.java b/user/src/com/google/gwt/uibinder/elementparsers/MenuItemParser.java
index 71bb725..8e848fb 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/MenuItemParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/MenuItemParser.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
import com.google.gwt.uibinder.rebind.XMLElement.Interpreter;
@@ -42,7 +43,7 @@
MenuBar.class.getCanonicalName());
class MenuBarInterpreter implements Interpreter<Boolean> {
- String menuBarField = null;
+ FieldWriter menuBarField = null;
public Boolean interpretElement(XMLElement child)
throws UnableToCompleteException {
@@ -67,7 +68,8 @@
elem.consumeChildElements(interpreter);
if (interpreter.menuBarField != null) {
- writer.genPropertySet(fieldName, "subMenu", interpreter.menuBarField);
+ writer.genPropertySet(fieldName, "subMenu",
+ interpreter.menuBarField.getNextReference());
}
}
}
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/StackLayoutPanelParser.java b/user/src/com/google/gwt/uibinder/elementparsers/StackLayoutPanelParser.java
index 0726b4f..1fd9381 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/StackLayoutPanelParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/StackLayoutPanelParser.java
@@ -19,6 +19,7 @@
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JEnumType;
import com.google.gwt.dom.client.Style.Unit;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
@@ -65,7 +66,7 @@
if (!writer.isWidgetElement(children.body)) {
writer.die(children.body, "Must be a widget");
}
- String childFieldName = writer.parseElementToField(children.body);
+ FieldWriter childField = writer.parseElementToField(children.body);
// Parse the header.
if (children.header != null) {
@@ -74,7 +75,7 @@
String size = children.header.consumeRequiredDoubleAttribute("size");
String html = children.header.consumeInnerHtml(htmlInt);
writer.addStatement("%s.add(%s, %s, true, %s);", fieldName,
- childFieldName, writer.declareTemplateCall(html, fieldName), size);
+ childField.getNextReference(), writer.declareTemplateCall(html, fieldName), size);
} else if (children.customHeader != null) {
XMLElement headerElement = children.customHeader.consumeSingleChildElement();
String size = children.customHeader.consumeRequiredDoubleAttribute("size");
@@ -82,9 +83,9 @@
writer.die(headerElement, "Is not a widget");
}
- String headerField = writer.parseElementToField(headerElement);
- writer.addStatement("%s.add(%s, %s, %s);", fieldName, childFieldName,
- headerField, size);
+ FieldWriter headerField = writer.parseElementToField(headerElement);
+ writer.addStatement("%s.add(%s, %s, %s);", fieldName, childField.getNextReference(),
+ headerField.getNextReference(), size);
} else {
// Neither a header or customHeader.
writer.die(stackElem, "Requires either a <%1$s:%2$s> or <%1$s:%3$s>",
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/StackPanelParser.java b/user/src/com/google/gwt/uibinder/elementparsers/StackPanelParser.java
index db8af7c..09722f8 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/StackPanelParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/StackPanelParser.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
@@ -42,11 +43,13 @@
stackItemLabel = child.consumeRawAttribute(variableAttributeName);
}
- String childFieldName = writer.parseElementToField(child);
+ FieldWriter childField = writer.parseElementToField(child);
if (stackItemLabel == null) {
- writer.addStatement("%1$s.add(%2$s);", fieldName, childFieldName);
+ writer.addStatement("%1$s.add(%2$s);", fieldName,
+ childField.getNextReference());
} else {
- writer.addStatement("%1$s.add(%2$s, \"%3$s\");", fieldName, childFieldName, stackItemLabel);
+ writer.addStatement("%1$s.add(%2$s, \"%3$s\");", fieldName,
+ childField.getNextReference(), stackItemLabel);
}
}
}
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/TabLayoutPanelParser.java b/user/src/com/google/gwt/uibinder/elementparsers/TabLayoutPanelParser.java
index b77534f..31abf60 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/TabLayoutPanelParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/TabLayoutPanelParser.java
@@ -19,6 +19,7 @@
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JEnumType;
import com.google.gwt.dom.client.Style.Unit;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
@@ -69,7 +70,7 @@
if (!writer.isWidgetElement(children.body)) {
writer.die(children.body, "Must be a widget");
}
- String childFieldName = writer.parseElementToField(children.body);
+ FieldWriter childField = writer.parseElementToField(children.body);
// Parse the header.
if (children.header != null) {
@@ -77,7 +78,8 @@
writer, fieldName);
String html = children.header.consumeInnerHtml(htmlInt);
writer.addStatement("%s.add(%s, %s, true);", fieldName,
- childFieldName, writer.declareTemplateCall(html, fieldName));
+ childField.getNextReference(),
+ writer.declareTemplateCall(html, fieldName));
} else if (children.customHeader != null) {
XMLElement headerElement = children.customHeader.consumeSingleChildElement();
@@ -85,9 +87,9 @@
writer.die(headerElement, "Is not a widget");
}
- String headerField = writer.parseElementToField(headerElement);
- writer.addStatement("%s.add(%s, %s);", fieldName, childFieldName,
- headerField);
+ FieldWriter headerField = writer.parseElementToField(headerElement);
+ writer.addStatement("%s.add(%s, %s);", fieldName,
+ childField.getNextReference(), headerField.getNextReference());
} else {
// Neither a header or customHeader.
writer.die(tabElem, "Requires either a <%1$s:%2$s> or <%1$s:%3$s>",
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/TabPanelParser.java b/user/src/com/google/gwt/uibinder/elementparsers/TabPanelParser.java
index a1736b0..6585d23 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/TabPanelParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/TabPanelParser.java
@@ -17,6 +17,7 @@
import com.google.gwt.core.ext.UnableToCompleteException;
import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
import com.google.gwt.uibinder.rebind.XMLElement;
@@ -43,7 +44,7 @@
// Get the single required child widget.
String tabHTML = null;
- String childFieldName = null;
+ FieldWriter childField = null;
for (XMLElement tabChild : tabElem.consumeChildElements()) {
if (tabChild.getLocalName().equals(TAG_TABHTML)) {
if (tabCaption != null || tabHTML != null) {
@@ -55,25 +56,26 @@
writer, fieldName);
tabHTML = tabChild.consumeInnerHtml(interpreter);
} else {
- if (childFieldName != null) {
+ if (childField != null) {
writer.die(tabChild, "May only have a single child widget");
}
if (!writer.isWidgetElement(tabChild)) {
writer.die(tabChild, "Must be a widget");
}
- childFieldName = writer.parseElementToField(tabChild);
+ childField = writer.parseElementToField(tabChild);
}
}
- if (childFieldName == null) {
+ if (childField == null) {
writer.die(tabElem, "Must have a child widget");
}
if (tabHTML != null) {
writer.addStatement("%1$s.add(%2$s, %3$s, true);", fieldName,
- childFieldName, writer.declareTemplateCall(tabHTML, fieldName));
+ childField.getNextReference(),
+ writer.declareTemplateCall(tabHTML, fieldName));
} else if (tabCaption != null) {
- writer.addStatement("%1$s.add(%2$s, %3$s);", fieldName, childFieldName,
- tabCaption);
+ writer.addStatement("%1$s.add(%2$s, %3$s);", fieldName,
+ childField.getNextReference(), tabCaption);
} else {
writer.die(tabElem,
"Requires either a \"text\" attribute or <%1$s:%2$s>",
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/UiChildParser.java b/user/src/com/google/gwt/uibinder/elementparsers/UiChildParser.java
index 21c5833..aef42aa 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/UiChildParser.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/UiChildParser.java
@@ -168,7 +168,7 @@
XMLElement toAdd) throws UnableToCompleteException {
JParameter[] params = method.getParameters();
String[] args = new String[params.length];
- args[0] = writer.parseElementToField(toAdd);
+ args[0] = writer.parseElementToField(toAdd).getNextReference();
// First parameter is the child widget
for (int index = 1; index < params.length; index++) {
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/WidgetInterpreter.java b/user/src/com/google/gwt/uibinder/elementparsers/WidgetInterpreter.java
index 4332c62..33fb349 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/WidgetInterpreter.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/WidgetInterpreter.java
@@ -85,7 +85,7 @@
String idHolder = uiWriter.declareDomIdHolder(null);
uiWriter.ensureCurrentFieldAttached();
- FieldWriter childFieldWriter = uiWriter.parseElementToFieldWriter(elem);
+ FieldWriter childFieldWriter = uiWriter.parseElementToField(elem);
String elementPointer = idHolder + "Element";
uiWriter.addInitStatement(
"com.google.gwt.user.client.Element %s = " +
diff --git a/user/src/com/google/gwt/uibinder/elementparsers/WidgetPlaceholderInterpreter.java b/user/src/com/google/gwt/uibinder/elementparsers/WidgetPlaceholderInterpreter.java
index cd4c81c..28cd666 100644
--- a/user/src/com/google/gwt/uibinder/elementparsers/WidgetPlaceholderInterpreter.java
+++ b/user/src/com/google/gwt/uibinder/elementparsers/WidgetPlaceholderInterpreter.java
@@ -121,7 +121,7 @@
for (String idHolder : idToWidgetElement.keySet()) {
XMLElement childElem = idToWidgetElement.get(idHolder);
- FieldWriter childFieldWriter = uiWriter.parseElementToFieldWriter(childElem);
+ FieldWriter childFieldWriter = uiWriter.parseElementToField(childElem);
genSetWidgetTextCall(idHolder, childFieldWriter.getName());
diff --git a/user/src/com/google/gwt/uibinder/rebind/AbstractFieldWriter.java b/user/src/com/google/gwt/uibinder/rebind/AbstractFieldWriter.java
index ea58f4cc..6ad0394 100644
--- a/user/src/com/google/gwt/uibinder/rebind/AbstractFieldWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/AbstractFieldWriter.java
@@ -49,6 +49,7 @@
return "attachRecord" + nextAttachVar++;
}
+ private final FieldManager manager;
private final Set<FieldWriter> needs = new LinkedHashSet<FieldWriter>();
private final List<String> statements = new ArrayList<String>();
private final List<String> attachStatements = new ArrayList<String>();
@@ -62,10 +63,12 @@
private final FieldWriterType fieldType;
private String html;
- public AbstractFieldWriter(String name, FieldWriterType fieldType, MortalLogger logger) {
+ public AbstractFieldWriter(FieldManager manager, FieldWriterType fieldType,
+ String name, MortalLogger logger) {
if (name == null) {
throw new RuntimeException("name cannot be null");
}
+ this.manager = manager;
this.name = name;
this.logger = logger;
this.buildPrecedence = 1;
@@ -110,6 +113,11 @@
return name;
}
+ @Override
+ public String getNextReference() {
+ return manager.convertFieldToGetter(name);
+ }
+
public JType getReturnType(String[] path, MonitoredLogger logger) {
if (!name.equals(path[0])) {
throw new RuntimeException(this
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldManager.java b/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
index a6af812..6cbc633 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
@@ -208,7 +208,7 @@
*/
public FieldWriter registerField(FieldWriterType fieldWriterType,
JClassType fieldType, String fieldName) throws UnableToCompleteException {
- FieldWriter field = new FieldWriterOfExistingType(
+ FieldWriter field = new FieldWriterOfExistingType(this,
fieldWriterType, fieldType, fieldName, logger);
return registerField(fieldName, field);
}
@@ -241,7 +241,7 @@
*/
public FieldWriter registerFieldForGeneratedCssResource(
ImplicitCssResource cssResource) throws UnableToCompleteException {
- FieldWriter field = new FieldWriterOfGeneratedCssResource(
+ FieldWriter field = new FieldWriterOfGeneratedCssResource(this,
typeOracle.findType(String.class.getCanonicalName()), cssResource, logger);
return registerField(cssResource.getName(), field);
}
@@ -262,7 +262,7 @@
if (ownerField == null) {
throw new RuntimeException("Cannot register a null owner field for LazyDomElement.");
}
- FieldWriter field = new FieldWriterOfLazyDomElement(
+ FieldWriter field = new FieldWriterOfLazyDomElement(this,
templateFieldType, ownerField, logger);
return registerField(ownerField.getName(), field);
}
@@ -290,7 +290,7 @@
public FieldWriter registerFieldOfGeneratedType(JClassType assignableType,
String typePackage, String typeName, String fieldName)
throws UnableToCompleteException {
- FieldWriter field = new FieldWriterOfGeneratedType(assignableType,
+ FieldWriter field = new FieldWriterOfGeneratedType(this, assignableType,
typePackage, typeName, fieldName, logger);
return registerField(fieldName, field);
}
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldWriter.java b/user/src/com/google/gwt/uibinder/rebind/FieldWriter.java
index dd9851d..f9c12a7 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldWriter.java
@@ -118,6 +118,13 @@
* Get the name of the field.
*/
String getName();
+
+ /**
+ * Returns the expression that to evaluate to get the contents of this field.
+ * Keeps a reference count, so if the field is to be used more than once it is
+ * important to call this method each time.
+ */
+ String getNextReference();
/**
* Returns the qualified source name of this type.
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfExistingType.java b/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfExistingType.java
index a9df6e7..c6d8a35 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfExistingType.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfExistingType.java
@@ -26,9 +26,9 @@
final JClassType type;
final MortalLogger logger;
- FieldWriterOfExistingType(FieldWriterType fieldType,
+ FieldWriterOfExistingType(FieldManager manager, FieldWriterType fieldType,
JClassType type, String name, MortalLogger logger) {
- super(name, fieldType, logger);
+ super(manager, fieldType, name, logger);
this.logger = logger;
if (type == null) {
throw new IllegalArgumentException("type cannot be null");
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResource.java b/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResource.java
index e89abdc..480a1df 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResource.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResource.java
@@ -33,9 +33,9 @@
private final ImplicitCssResource css;
private final JType stringType;
- public FieldWriterOfGeneratedCssResource(JType stringType,
+ public FieldWriterOfGeneratedCssResource(FieldManager manager, JType stringType,
ImplicitCssResource css, MortalLogger logger) {
- super(css.getName(), FieldWriterType.GENERATED_CSS, logger);
+ super(manager, FieldWriterType.GENERATED_CSS, css.getName(), logger);
this.stringType = stringType;
this.css = css;
}
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedType.java b/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedType.java
index 5b353b8..2139b31 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedType.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedType.java
@@ -27,9 +27,9 @@
private final String typeName;
private final JClassType assignableType;
- public FieldWriterOfGeneratedType(JClassType assignableType, String typePackage,
+ public FieldWriterOfGeneratedType(FieldManager manager, JClassType assignableType, String typePackage,
String typeName, String name, MortalLogger logger) {
- super(name, FieldWriterType.GENERATED_BUNDLE, logger);
+ super(manager, FieldWriterType.GENERATED_BUNDLE, name, logger);
if (assignableType == null) {
throw new RuntimeException("assignableType must not be null");
}
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfLazyDomElement.java b/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfLazyDomElement.java
index 66aba1c..519c6ef 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfLazyDomElement.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfLazyDomElement.java
@@ -35,9 +35,9 @@
*/
private final JClassType parameterType;
- public FieldWriterOfLazyDomElement(JClassType templateFieldType,
+ public FieldWriterOfLazyDomElement(FieldManager manager, JClassType templateFieldType,
OwnerField ownerField, MortalLogger logger) throws UnableToCompleteException {
- super(ownerField.getName(), FieldWriterType.DEFAULT, logger);
+ super(manager, FieldWriterType.DEFAULT, ownerField.getName(), logger);
// ownerFieldType null means LazyDomElement is not parameterized.
this.ownerFieldType = ownerField.getRawType().isParameterized();
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldWriterType.java b/user/src/com/google/gwt/uibinder/rebind/FieldWriterType.java
index cb24f35..2033f64 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldWriterType.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldWriterType.java
@@ -19,7 +19,7 @@
/**
* A simple enum holding all FieldWriter types.
*/
-enum FieldWriterType {
+public enum FieldWriterType {
GENERATED_BUNDLE(6),
GENERATED_CSS(5),
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
index d513f09..9cd10d3 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
@@ -128,7 +128,7 @@
* Parses the root UiBinder element, and kicks off the parsing of the rest of
* the document.
*/
- public String parse(XMLElement elem) throws UnableToCompleteException {
+ public FieldWriter parse(XMLElement elem) throws UnableToCompleteException {
if (!writer.isBinderElement(elem)) {
writer.die(elem, "Bad prefix on <%s:%s>? The root element must be in "
+ "xml namespace \"%s\" (usually with prefix \"ui:\"), "
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
index 0a9e0dc..9aba760 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
@@ -905,37 +905,13 @@
/**
* Parses the object associated with the specified element, and returns the
- * name of the field (possibly private) that will hold it. The element is
- * likely to make recursive calls back to this method to have its children
- * parsed.
- *
- * @param elem the xml element to be parsed
- * @return the name of the field containing the parsed widget
- */
- public String parseElementToField(XMLElement elem) throws UnableToCompleteException {
- /**
- * TODO(hermes,rjrjr,rdcastro): seems bad we have to run
- * parseElementToFieldWriter(), get the field writer and then call
- * fieldManager.convertFieldToGetter().
- *
- * Can't we move convertFieldToGetter() to FieldWriter?
- *
- * The current answer is no because convertFieldToGetter() might be called
- * before a given FieldWriter is actually created.
- */
- FieldWriter field = parseElementToFieldWriter(elem);
- return fieldManager.convertFieldToGetter(field.getName());
- }
-
- /**
- * Parses the object associated with the specified element, and returns the
* field writer that will hold it. The element is likely to make recursive
* calls back to this method to have its children parsed.
*
* @param elem the xml element to be parsed
* @return the field holder just created
*/
- public FieldWriter parseElementToFieldWriter(XMLElement elem) throws UnableToCompleteException {
+ public FieldWriter parseElementToField(XMLElement elem) throws UnableToCompleteException {
if (elementParsers.isEmpty()) {
registerParsers();
}
@@ -1379,7 +1355,7 @@
// Allow GWT.create() to init the field, the default behavior
- String rootField = new UiBinderParser(this, messages, fieldManager, oracle, bundleClass,
+ FieldWriter rootField = new UiBinderParser(this, messages, fieldManager, oracle, bundleClass,
binderUri, uiBinderCtx).parse(elem);
fieldManager.validate();
@@ -1661,7 +1637,7 @@
/**
* Writes the UiBinder's source.
*/
- private void writeBinder(IndentedWriter w, String rootField) throws UnableToCompleteException {
+ private void writeBinder(IndentedWriter w, FieldWriter rootField) throws UnableToCompleteException {
writePackage(w);
writeImports(w);
@@ -1699,7 +1675,7 @@
writeCssInjectors(w);
- w.write("return %s;", rootField);
+ w.write("return %s;", rootField.getNextReference());
w.outdent();
w.write("}");
@@ -1711,7 +1687,7 @@
/**
* Writes a different optimized UiBinder's source for the renderable strategy.
*/
- private void writeBinderForRenderableStrategy(IndentedWriter w, String rootField)
+ private void writeBinderForRenderableStrategy(IndentedWriter w, FieldWriter rootField)
throws UnableToCompleteException {
writePackage(w);
@@ -1736,7 +1712,7 @@
designTime.writeAttributes(this);
w.newline();
- w.write("return new Widgets(owner).%s;", rootField);
+ w.write("return new Widgets(owner).%s;", rootField.getNextReference());
w.outdent();
w.write("}");
@@ -1914,7 +1890,7 @@
/**
* Writes the UiRenderer's source for the renderable strategy.
*/
- private void writeRenderer(IndentedWriter w, String rootField) throws UnableToCompleteException {
+ private void writeRenderer(IndentedWriter w, FieldWriter rootField) throws UnableToCompleteException {
validateRendererGetters(baseClass);
validateRenderParameters(baseClass);
JMethod[] eventMethods = findEventMethods(baseClass);
@@ -1956,9 +1932,7 @@
fieldManager.initializeWidgetsInnerClass(w, getOwnerClass());
w.newline();
- // TODO(rchandia) Find a better way to get the root field name
- String rootFieldName = rootField.substring(4, rootField.length() - 2);
- String safeHtml = fieldManager.lookup(rootFieldName).getSafeHtml();
+ String safeHtml = rootField.getSafeHtml();
// TODO(rchandia) it should be possible to add the attribute when parsing
// the UiBinder file
@@ -1972,9 +1946,9 @@
fieldManager.writeFieldDefinitions(w, getOracle(), getOwnerClass(), getDesignTime());
- writeRendererGetters(w, baseClass, rootFieldName);
+ writeRendererGetters(w, baseClass, rootField.getName());
- writeRendererEventMethods(w, eventMethods, rootFieldName);
+ writeRendererEventMethods(w, eventMethods, rootField.getName());
// Close class
w.outdent();
diff --git a/user/test/com/google/gwt/uibinder/LazyWidgetBuilderSuite.java b/user/test/com/google/gwt/uibinder/LazyWidgetBuilderSuite.java
index e638632..d237d85 100644
--- a/user/test/com/google/gwt/uibinder/LazyWidgetBuilderSuite.java
+++ b/user/test/com/google/gwt/uibinder/LazyWidgetBuilderSuite.java
@@ -16,6 +16,7 @@
package com.google.gwt.uibinder;
import com.google.gwt.junit.tools.GWTTestSuite;
+import com.google.gwt.uibinder.test.client.CellPanelParserIntegrationTest;
import com.google.gwt.uibinder.test.client.IsRenderableIntegrationTest;
import com.google.gwt.uibinder.test.client.LazyWidgetBuilderSafeUriIntegrationTest;
import com.google.gwt.uibinder.test.client.SafeHtmlAsComponentsTest;
@@ -33,6 +34,7 @@
GWTTestSuite suite = new GWTTestSuite(
"Tests that rely on the useLazyWidgetBuilders switch");
+ suite.addTestSuite(CellPanelParserIntegrationTest.class);
suite.addTestSuite(IsRenderableIntegrationTest.class);
suite.addTestSuite(LazyWidgetBuilderSafeUriIntegrationTest.class);
suite.addTestSuite(SafeHtmlAsComponentsTest.class);
diff --git a/user/test/com/google/gwt/uibinder/elementparsers/MockFieldWriter.java b/user/test/com/google/gwt/uibinder/elementparsers/MockFieldWriter.java
new file mode 100644
index 0000000..b0552f1
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/elementparsers/MockFieldWriter.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.uibinder.elementparsers;
+
+import com.google.gwt.core.ext.typeinfo.JClassType;
+import com.google.gwt.core.ext.typeinfo.JType;
+import com.google.gwt.core.ext.typeinfo.TypeOracle;
+import com.google.gwt.uibinder.rebind.DesignTimeUtils;
+import com.google.gwt.uibinder.rebind.FieldWriter;
+import com.google.gwt.uibinder.rebind.FieldWriterType;
+import com.google.gwt.uibinder.rebind.IndentedWriter;
+import com.google.gwt.uibinder.rebind.MonitoredLogger;
+import com.google.gwt.uibinder.rebind.model.OwnerField;
+
+final class MockFieldWriter implements FieldWriter {
+ private final String tag;
+
+ MockFieldWriter(String tag) {
+ this.tag = tag;
+ }
+
+ @Override
+ public void addAttachStatement(String format, Object... args) {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public void addDetachStatement(String format, Object... args) {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public void addStatement(String format, Object... args) {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public JClassType getAssignableType() {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public int getBuildPrecedence() {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public FieldWriterType getFieldType() {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public String getHtml() {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public String getInitializer() {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public JClassType getInstantiableType() {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public String getNextReference() {
+ return tag;
+ }
+
+ @Override
+ public String getName() {
+ return tag;
+ }
+
+ @Override
+ public String getQualifiedSourceName() {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public JType getReturnType(String[] path, MonitoredLogger logger) {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public String getSafeHtml() {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public void needs(FieldWriter f) {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public void setBuildPrecedence(int precedence) {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public void setHtml(String html) {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public void setInitializer(String initializer) {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public void write(IndentedWriter w) {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public void writeFieldBuilder(IndentedWriter w, int getterCount,
+ OwnerField ownerField) {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+
+ @Override
+ public void writeFieldDefinition(IndentedWriter w, TypeOracle typeOracle,
+ OwnerField ownerField, DesignTimeUtils designTime, int getterCount,
+ boolean useLazyWidgetBuilders) {
+ throw new UnsupportedOperationException("Auto-generated method stub");
+ }
+}
\ No newline at end of file
diff --git a/user/test/com/google/gwt/uibinder/elementparsers/MockUiBinderWriter.java b/user/test/com/google/gwt/uibinder/elementparsers/MockUiBinderWriter.java
index 2bbe7cf..8231ddd 100644
--- a/user/test/com/google/gwt/uibinder/elementparsers/MockUiBinderWriter.java
+++ b/user/test/com/google/gwt/uibinder/elementparsers/MockUiBinderWriter.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2009 Google Inc.
+ * Copyright 2011 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
@@ -20,6 +20,7 @@
import com.google.gwt.core.ext.typeinfo.TypeOracle;
import com.google.gwt.uibinder.rebind.DesignTimeUtilsStub;
import com.google.gwt.uibinder.rebind.FieldManager;
+import com.google.gwt.uibinder.rebind.FieldWriter;
import com.google.gwt.uibinder.rebind.MortalLogger;
import com.google.gwt.uibinder.rebind.UiBinderContext;
import com.google.gwt.uibinder.rebind.UiBinderWriter;
@@ -54,7 +55,8 @@
}
@Override
- public String parseElementToField(XMLElement elem) {
- return elem.consumeOpeningTag();
+ public FieldWriter parseElementToField(XMLElement elem) {
+ final String tag = elem.consumeOpeningTag();
+ return new MockFieldWriter(tag);
}
}
diff --git a/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfExistingTypeTest.java b/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfExistingTypeTest.java
index 0b959c6..4ffaa60 100644
--- a/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfExistingTypeTest.java
+++ b/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfExistingTypeTest.java
@@ -54,7 +54,7 @@
public void testNullType() throws Exception {
control.replay();
try {
- FieldWriter field = new FieldWriterOfExistingType(
+ FieldWriter field = new FieldWriterOfExistingType(null,
FieldWriterType.DEFAULT, null, FIELD_NAME, MortalLogger.NULL);
fail("Expected exception not thrown.");
} catch (IllegalArgumentException e) {
@@ -76,7 +76,7 @@
expect(rawType.getQualifiedSourceName()).andReturn(QUALIFIED_SOURCE_NAME);
control.replay();
- FieldWriter field = new FieldWriterOfExistingType(
+ FieldWriter field = new FieldWriterOfExistingType(null,
FieldWriterType.DEFAULT, type, FIELD_NAME, MortalLogger.NULL);
assertSame(rawType, field.getAssignableType());
@@ -94,7 +94,7 @@
expect(type.getQualifiedSourceName()).andReturn(QUALIFIED_SOURCE_NAME);
control.replay();
- FieldWriter field = new FieldWriterOfExistingType(
+ FieldWriter field = new FieldWriterOfExistingType(null,
FieldWriterType.DEFAULT, type, FIELD_NAME, MortalLogger.NULL);
assertSame(type, field.getAssignableType());
diff --git a/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResourceTest.java b/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResourceTest.java
index 00b1526..8bed8c8 100644
--- a/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResourceTest.java
+++ b/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResourceTest.java
@@ -59,7 +59,7 @@
MortalLogger.NULL, Collections.<JClassType> emptySet());
FieldWriterOfGeneratedCssResource f = new FieldWriterOfGeneratedCssResource(
- stringType, css, MortalLogger.NULL);
+ null, stringType, css, MortalLogger.NULL);
assertEquals(stringType, f.getReturnType(new String[] {
"fieldName", "ableBaker"}, new MonitoredLogger(MortalLogger.NULL)));
@@ -75,7 +75,7 @@
MortalLogger.NULL, Collections.<JClassType> emptySet());
FieldWriterOfGeneratedCssResource f = new FieldWriterOfGeneratedCssResource(
- stringType, css, MortalLogger.NULL);
+ null, stringType, css, MortalLogger.NULL);
assertEquals(stringType, f.getReturnType(new String[] {
"fieldName", "able-baker"}, new MonitoredLogger(MortalLogger.NULL)));
diff --git a/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfLazyDomElementTest.java b/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfLazyDomElementTest.java
index 4c540ab..64ac528 100644
--- a/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfLazyDomElementTest.java
+++ b/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfLazyDomElementTest.java
@@ -67,7 +67,7 @@
control.replay();
try {
- FieldWriter field = new FieldWriterOfLazyDomElement(
+ FieldWriter field = new FieldWriterOfLazyDomElement(null,
templateFieldType, ownerField, MortalLogger.NULL);
fail("Expected exception not thrown.");
} catch (UnableToCompleteException utce) {
@@ -100,7 +100,7 @@
control.replay();
try {
- FieldWriter field = new FieldWriterOfLazyDomElement(
+ FieldWriter field = new FieldWriterOfLazyDomElement(null,
templateFieldType, ownerField, MortalLogger.NULL);
fail("Expected exception not thrown.");
} catch (UnableToCompleteException utce) {
@@ -125,7 +125,8 @@
expect(arg.getQualifiedSourceName()).andReturn(ARG_QUALIFIED_SOURCE_NAME);
control.replay();
- FieldWriter field = new FieldWriterOfLazyDomElement(templateFieldType, ownerField, MortalLogger.NULL);
+ FieldWriter field = new FieldWriterOfLazyDomElement(null,
+ templateFieldType, ownerField, MortalLogger.NULL);
assertSame(parameterClass, field.getAssignableType());
assertSame(parameterClass, field.getInstantiableType());
assertEquals(QUALIFIED_SOURCE_NAME + "<" + ARG_QUALIFIED_SOURCE_NAME + ">",
diff --git a/user/test/com/google/gwt/uibinder/test/client/CellPanelParserIntegrationTest.Renderable.ui.xml b/user/test/com/google/gwt/uibinder/test/client/CellPanelParserIntegrationTest.Renderable.ui.xml
new file mode 100644
index 0000000..a36042a
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/test/client/CellPanelParserIntegrationTest.Renderable.ui.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2011 Google Inc.
+ Licensed under the Apache License, Version 2.0 (the "License"); you
+ may not use this file except in compliance with the License. You may
+ may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied. License for the specific language governing permissions and
+ limitations under the License.
+-->
+<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
+ xmlns:gwt='urn:import:com.google.gwt.user.client.ui'>
+ <gwt:VerticalPanel ui:field='verticalPanel'>
+ <gwt:cell horizontalAlignment='ALIGN_RIGHT'>
+ <gwt:HTMLPanel>
+ <gwt:Anchor text='Refresh' ui:field='refresh'
+ href='javascript:void(0)' />
+ |
+ <gwt:Anchor text='Launch App' target='_blank'
+ ui:field='appLaunch' href='https://googlehomework.appspot.com/user' />
+ </gwt:HTMLPanel>
+ </gwt:cell>
+ </gwt:VerticalPanel>
+</ui:UiBinder>
diff --git a/user/test/com/google/gwt/uibinder/test/client/CellPanelParserIntegrationTest.java b/user/test/com/google/gwt/uibinder/test/client/CellPanelParserIntegrationTest.java
new file mode 100644
index 0000000..a40119f
--- /dev/null
+++ b/user/test/com/google/gwt/uibinder/test/client/CellPanelParserIntegrationTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2011 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.uibinder.test.client;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.user.client.ui.Composite;
+import com.google.gwt.user.client.ui.RootPanel;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * Tests SafeUri parsing with the lazy widget builder.
+ */
+public class CellPanelParserIntegrationTest extends SafeUriIntegrationTest {
+ static class Renderable extends Composite {
+ interface Binder extends UiBinder<Widget, Renderable> {
+ }
+
+ private static final Binder BINDER = GWT.create(Binder.class);
+
+ public Renderable() {
+ initWidget(BINDER.createAndBindUi(this));
+ }
+ }
+
+ @Override
+ public String getModuleName() {
+ return "com.google.gwt.uibinder.test.LazyWidgetBuilderSuite";
+ }
+
+ public void testIsRenderable() {
+ Renderable ui = new Renderable();
+
+ try {
+ RootPanel.get().add(ui);
+ } finally {
+ ui.removeFromParent();
+ }
+ }
+
+}