Made UiBinder class lookup more generous.
Previously <gwt:foo.Bar would look for class foo with inner class Bar.
Now it also looks for package foo containing class Bar.
Review at http://gwt-code-reviews.appspot.com/1386803
Review by: sbrubaker@google.com
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@9934 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
index 3e292f0..9b6a867 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
@@ -517,19 +517,29 @@
}
String ns = elem.getNamespaceUri();
+ String packageName = ns;
+ String className = tagName;
- JPackage pkg = parseNamespacePackage(ns);
- if (pkg == null) {
- throw new RuntimeException("No such package: " + ns);
+ while (true) {
+ JPackage pkg = parseNamespacePackage(packageName);
+ if (pkg == null) {
+ throw new RuntimeException("No such package: " + packageName);
+ }
+
+ JClassType rtn = pkg.findType(className);
+ if (rtn != null) {
+ return rtn;
+ }
+
+ // Try again: shift one element of the class name onto the package name.
+ // If the class name has only one element left, fail.
+ int index = className.indexOf(".");
+ if (index == -1) {
+ die(elem, "No class matching \"%s\" in %s", tagName, ns);
+ }
+ packageName = packageName + "." + className.substring(0, index);
+ className = className.substring(index + 1);
}
-
- JClassType rtn = null;
- rtn = pkg.findType(tagName);
- if (rtn == null) {
- die(elem, "No class matching \"%s\" in %s", tagName, ns);
- }
-
- return rtn;
}
/**
diff --git a/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.ui.xml b/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.ui.xml
index 45de285..14a669c 100644
--- a/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.ui.xml
+++ b/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.ui.xml
@@ -47,6 +47,8 @@
<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
xmlns:gwt='urn:import:com.google.gwt.user.client.ui'
+ xmlns:gwt2='urn:import:com.google.gwt.user.client'
+ xmlns:gwt3='urn:import:com'
xmlns:demo='urn:import:com.google.gwt.uibinder.test.client'
xmlns:legacyValuesForBeans='urn:with:com.google.gwt.uibinder.test.client.WidgetBasedUi.FakeBundle2'
@@ -665,9 +667,9 @@
<gwt:DateLabel ui:field='myDateLabel2' format='{MY_DATE_FORMAT}' />
<gwt:NumberLabel ui:field='myNumberLabel' predefinedFormat='SCIENTIFIC' />
- <gwt:NumberLabel ui:field='myNumberLabel2' format='{MY_NUMBER_FORMAT}' />
+ <gwt2:ui.NumberLabel ui:field='myNumberLabel2' format='{MY_NUMBER_FORMAT}' />
- <gwt:ValueLabel ui:field='myValueLabel' renderer='{doubleRenderer}' />
+ <gwt3:google.gwt.user.client.ui.ValueLabel ui:field='myValueLabel' renderer='{doubleRenderer}' />
<img src="{values.aUrl}" ui:field='myImage'/>