Fixes regressions in @UiHandler.
Change-Id: Id929d771ed05d8a25f49d2c9256dc44ee034f7c3
Review-Link: https://gwt-review.googlesource.com/#/c/6175/
(cherry picked from commit 12a8262eb2534f79af49e2a830eb7a5b770cba87)
diff --git a/user/src/com/google/gwt/uibinder/rebind/HandlerEvaluator.java b/user/src/com/google/gwt/uibinder/rebind/HandlerEvaluator.java
index a2fd077..ecce7e6 100644
--- a/user/src/com/google/gwt/uibinder/rebind/HandlerEvaluator.java
+++ b/user/src/com/google/gwt/uibinder/rebind/HandlerEvaluator.java
@@ -223,9 +223,8 @@
writer.newline();
// Create the anonymous class extending the raw type to avoid errors under the new JDT
// if the type has a wildcard.
- writer.write("final %1$s %2$s = (%1$s) new %3$s() {",
- handlerType.getParameterizedQualifiedSourceName(), handlerVarName,
- handlerType.getQualifiedSourceName());
+ writer.write("final %1$s %2$s = new %1$s() {",
+ handlerType.getQualifiedSourceName(), handlerVarName);
writer.indent();
writer.write("public void %1$s(%2$s event) {", methods[0].getName(),
// Use the event raw type to match the signature as we are using implementing the raw type
@@ -303,7 +302,10 @@
continue;
}
- JType methodParam = parameters[0].getType();
+ JClassType methodParam = parameters[0].getType().isClassOrInterface();
+ if (methodParam == null) {
+ continue;
+ }
if (handlerType.equals(methodParam)) {
@@ -330,16 +332,12 @@
* This is done as an alternative handler method to preserve the
* original logic.
*/
- JParameterizedType ptype = handlerType.isParameterized();
- if (ptype != null) {
- // Alt 1: TableHandler<String> => TableHandler
- if (methodParam.equals(ptype.getRawType())) {
- alternativeHandlerMethod = method;
- }
-
+ if (handlerType.isAssignableFrom(methodParam)) {
+ // Alt 1: TableHandler<String> => TableHandler or TableHandler<?> => TableHandler<String>
+ alternativeHandlerMethod = method;
+ } else if (handlerType.isParameterized() != null && objectType.isGenericType() != null) {
// Alt 2: TableHandler<String> => TableHandler<T>
- if (objectType.isGenericType() != null
- && methodParam.getErasedType().equals(ptype.getRawType())) {
+ if (methodParam.getErasedType().equals(handlerType.isParameterized().getErasedType())) {
// Unfortunately this is overly lenient but it was always like this
alternativeHandlerMethod2 = method;
}
diff --git a/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.java b/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.java
index 84f1d77..e389f98 100644
--- a/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.java
+++ b/user/test/com/google/gwt/uibinder/test/client/WidgetBasedUi.java
@@ -52,6 +52,7 @@
import com.google.gwt.user.client.ui.HasHTML;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Image;
+import com.google.gwt.user.client.ui.IntegerBox;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.MenuBar;
@@ -201,6 +202,7 @@
@UiField(provided = true) @SuppressWarnings("rawtypes")
Renderer doubleRenderer = DoubleRenderer.instance();
@UiField ValueLabel<Double> myValueLabel;
+ @UiField IntegerBox myIntegerBox;
@UiField DoubleBox myDoubleBox;
@SuppressWarnings("rawtypes")
@UiField ValueChangeWidget<List> myValueChangeWidget;
@@ -219,6 +221,9 @@
this.doubleValueChangeEvent = event;
}
+ @UiHandler({"myIntegerBox", "myDoubleBox"})
+ void onWildcardValueChange_Multi(ValueChangeEvent<?> event) { /* EMPTY */}
+
@UiHandler("myValueChangeWidget")
void onWildcardValueChange(ValueChangeEvent<?> event) { /* EMPTY */}
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 5eea996..8ef7529 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
@@ -691,6 +691,7 @@
<gwt3:google.gwt.user.client.ui.ValueLabel ui:field='myValueLabel' renderer='{doubleRenderer}' />
+ <gwt:IntegerBox ui:field='myIntegerBox' />
<gwt:DoubleBox ui:field='myDoubleBox' />
<demo:ValueChangeWidget ui:field='myValueChangeWidget' />
<demo:ValueChangeWidget ui:field='myValueChangeWidget_raw' />