Revision: 7032
Author: rj...@google.com
Date: Thu Nov 19 13:38:23 2009
Log: Improves @UiFactory's handling of generics from catastrophic to  
inadequate.

We were generating bad code when @UiFactory was put
on a method with a parameterized return type. The
solution here is simplistic, treating everything
as the raw type and not validating that the
param type matches what is expected in the template,
but I think it's an improvement.

The actual fix is small, but the change to the
test classes is pretty big: OwnerClassTest no
longer uses JClassTypeAdapter, which I'm hoping eventually
to delete in favor of mock compile state. This was necessary
because JClassTypeAdapter doesn't deal with generics.

Review by bobv
http://gwt-code-reviews.appspot.com/106801
http://code.google.com/p/google-web-toolkit/source/detail?r=7032

Added:
  /trunk/user/test/com/google/gwt/uibinder/test/client/Abstract.java
   
/trunk/user/test/com/google/gwt/uibinder/test/client/ParameterizedWidgets.java
   
/trunk/user/test/com/google/gwt/uibinder/test/client/ParameterizedWidgets.ui.xml
   
/trunk/user/test/com/google/gwt/uibinder/test/client/TestParameterizedWidgets.java
Modified:
  /trunk/user/src/com/google/gwt/uibinder/rebind/model/OwnerClass.java
  /trunk/user/test/com/google/gwt/uibinder/UiBinderGwtSuite.java
  /trunk/user/test/com/google/gwt/uibinder/rebind/model/OwnerClassTest.java
  /trunk/user/test/com/google/gwt/uibinder/test/UiJavaResources.java

=======================================
--- /dev/null
+++ /trunk/user/test/com/google/gwt/uibinder/test/client/Abstract.java  Thu  
Nov 19 13:38:23 2009
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2009 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.dom.client.Document;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * Used by {...@link ParameterizedWidgets}.
+ * @see TestParameterizedWidgets
+ */
+abstract class Abstract<T> extends Widget {
+  Abstract() {
+    setElement(Document.get().createDivElement());
+  }
+}
=======================================
--- /dev/null
+++  
/trunk/user/test/com/google/gwt/uibinder/test/client/ParameterizedWidgets.java  
 
Thu Nov 19 13:38:23 2009
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2009 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.uibinder.client.UiFactory;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.user.client.ui.Widget;
+
+/**
+ * Used by {...@link TestParameterizedWidgets}
+ */
+class ParameterizedWidgets {
+  interface Binder extends UiBinder<Widget, ParameterizedWidgets> {
+  }
+
+  static final Binder binder = GWT.create(Binder.class);
+
+  @UiField
+  Abstract<?> a;
+
+  ParameterizedWidgets() {
+    binder.createAndBindUi(this);
+  }
+
+  @UiFactory
+  Abstract<?> createA() {
+    return new Abstract<String>() {
+    };
+  }
+}
=======================================
--- /dev/null
+++  
/trunk/user/test/com/google/gwt/uibinder/test/client/ParameterizedWidgets.ui.xml
         
Thu Nov 19 13:38:23 2009
@@ -0,0 +1,4 @@
+<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
+    xmlns:t="urn:import:com.google.gwt.uibinder.test.client">
+ <t:Abstract ui:field='a'></t:Abstract>
+</ui:UiBinder>
=======================================
--- /dev/null
+++  
/trunk/user/test/com/google/gwt/uibinder/test/client/TestParameterizedWidgets.java
       
Thu Nov 19 13:38:23 2009
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2009 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.junit.client.GWTTestCase;
+
+/**
+ * Test that {...@literal @}UiFactory and parameterized return types get  
along.
+ */
+public class TestParameterizedWidgets extends GWTTestCase {
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.uibinder.test.UiBinderTestApp";
+  }
+
+  public void testHappy() {
+    ParameterizedWidgets ui = new ParameterizedWidgets();
+    assertNotNull(ui.a);
+  }
+}
=======================================
--- /trunk/user/src/com/google/gwt/uibinder/rebind/model/OwnerClass.java        
 
Fri Nov  6 16:08:46 2009
+++ /trunk/user/src/com/google/gwt/uibinder/rebind/model/OwnerClass.java        
 
Thu Nov 19 13:38:23 2009
@@ -18,7 +18,9 @@
  import com.google.gwt.core.ext.UnableToCompleteException;
  import com.google.gwt.core.ext.typeinfo.JClassType;
  import com.google.gwt.core.ext.typeinfo.JField;
+import com.google.gwt.core.ext.typeinfo.JGenericType;
  import com.google.gwt.core.ext.typeinfo.JMethod;
+import com.google.gwt.core.ext.typeinfo.JParameterizedType;
  import com.google.gwt.uibinder.client.UiFactory;
  import com.google.gwt.uibinder.client.UiField;
  import com.google.gwt.uibinder.client.UiHandler;
@@ -85,6 +87,11 @@
     * @return the factory method, or null if none exists
     */
    public JMethod getUiFactoryMethod(JClassType forType) {
+    JGenericType genericType = forType.isGenericType();
+    if (genericType != null) {
+      forType = genericType.getRawType();
+    }
+
      return uiFactories.get(forType);
    }

@@ -148,6 +155,11 @@
            logger.die("Factory return type is not a class in method "
                + method.getName());
          }
+
+        JParameterizedType paramType = factoryType.isParameterized();
+        if (paramType != null) {
+          factoryType = paramType.getRawType();
+        }

          if (uiFactories.containsKey(factoryType)) {
            logger.die("Duplicate factory in class "
=======================================
--- /trunk/user/test/com/google/gwt/uibinder/UiBinderGwtSuite.java      Mon Nov 
  
2 12:47:15 2009
+++ /trunk/user/test/com/google/gwt/uibinder/UiBinderGwtSuite.java      Thu Nov 
 
19 13:38:23 2009
@@ -16,6 +16,7 @@
  package com.google.gwt.uibinder;

  import com.google.gwt.junit.tools.GWTTestSuite;
+import com.google.gwt.uibinder.test.client.TestParameterizedWidgets;
  import com.google.gwt.uibinder.test.client.UiBinderTest;

  import junit.framework.Test;
@@ -29,6 +30,7 @@
          "Test suite for UiBinder GWTTestCases");

      suite.addTestSuite(UiBinderTest.class);
+    suite.addTestSuite(TestParameterizedWidgets.class);

      return suite;
    }
=======================================
---  
/trunk/user/test/com/google/gwt/uibinder/rebind/model/OwnerClassTest.java       
 
Wed Nov  4 13:42:26 2009
+++  
/trunk/user/test/com/google/gwt/uibinder/rebind/model/OwnerClassTest.java       
 
Thu Nov 19 13:38:23 2009
@@ -1,12 +1,12 @@
  /*
   * Copyright 2009 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
@@ -15,22 +15,26 @@
   */
  package com.google.gwt.uibinder.rebind.model;

+import com.google.gwt.core.ext.TreeLogger;
  import com.google.gwt.core.ext.UnableToCompleteException;
  import com.google.gwt.core.ext.typeinfo.JClassType;
  import com.google.gwt.core.ext.typeinfo.JMethod;
  import com.google.gwt.core.ext.typeinfo.JParameter;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.MouseOverEvent;
-import com.google.gwt.uibinder.client.UiFactory;
-import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.core.ext.typeinfo.JType;
+import com.google.gwt.core.ext.typeinfo.TypeOracle;
+import com.google.gwt.dev.javac.CompilationState;
+import com.google.gwt.dev.javac.CompilationStateBuilder;
+import com.google.gwt.dev.javac.impl.MockJavaResource;
+import com.google.gwt.dev.resource.Resource;
+import com.google.gwt.dev.util.log.PrintWriterTreeLogger;
  import com.google.gwt.uibinder.client.UiHandler;
-import com.google.gwt.uibinder.rebind.JClassTypeAdapter;
  import com.google.gwt.uibinder.rebind.MortalLogger;
-import com.google.gwt.user.client.ui.Button;
-import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.uibinder.test.UiJavaResources;

  import junit.framework.TestCase;

+import java.io.PrintWriter;
+import java.util.Arrays;
  import java.util.Collection;
  import java.util.HashSet;
  import java.util.List;
@@ -41,24 +45,237 @@
   */
  public class OwnerClassTest extends TestCase {

-  private JClassTypeAdapter gwtTypeAdapter;
+  private static TreeLogger createCompileLogger() {
+    PrintWriterTreeLogger logger = new PrintWriterTreeLogger(new  
PrintWriter(
+        System.err, true));
+    logger.setMaxDetail(TreeLogger.ERROR);
+    return logger;
+  }
+
+  private TypeOracle types;
+  private JClassType labelType;
+  private JClassType buttonType;
+  private JClassType clickEventType;
+  private JClassType mouseOverEventType;

    @Override
    protected void setUp() throws Exception {
      super.setUp();
-
-    gwtTypeAdapter = new JClassTypeAdapter();
+    CompilationState state = CompilationStateBuilder.buildFrom(
+        createCompileLogger(), getJavaResources());
+    types = state.getTypeOracle();
+    labelType = types.findType("com.google.gwt.user.client.ui.Label");
+    buttonType = types.findType("com.google.gwt.user.client.ui.Button");
+    clickEventType =  
types.findType("com.google.gwt.event.dom.client.ClickEvent");
+    mouseOverEventType =  
types.findType("com.google.gwt.event.dom.client.MouseOverEvent");
    }

-  /**
-   * Empty uibinder class for sanity checking.
-   */
-  private static class EmptyOwnerClass { }
+  private Set<Resource> getJavaResources() {
+    MockJavaResource[] javaFiles = {
+        new MockJavaResource(
+            "com.google.gwt.uibinder.rebind.model.EmptyOwnerClass") {
+          @Override
+          protected CharSequence getContent() {
+            StringBuffer code = new StringBuffer();
+            code.append("package com.google.gwt.uibinder.rebind.model;\n");
+            code.append("public class EmptyOwnerClass {\n");
+            code.append("}\n");
+            return code;
+          }
+        },
+        new MockJavaResource(
+            "com.google.gwt.uibinder.rebind.model.BadUiFactoryClass") {
+          @Override
+          protected CharSequence getContent() {
+            StringBuffer code = new StringBuffer();
+            code.append("package com.google.gwt.uibinder.rebind.model;\n");
+            code.append("import  
com.google.gwt.uibinder.client.UiFactory;\n");
+            code.append("public class BadUiFactoryClass {\n");
+            code.append("  @UiFactory int thisShouldntWork() { return 0;  
}\n");
+            code.append("}\n");
+            return code;
+          }
+        },
+        new MockJavaResource(
+            "com.google.gwt.uibinder.rebind.model.UiFieldsClass") {
+          @Override
+          protected CharSequence getContent() {
+            StringBuffer code = new StringBuffer();
+            code.append("package com.google.gwt.uibinder.rebind.model;\n");
+            code.append("import com.google.gwt.user.client.ui.Button;\n");
+            code.append("import com.google.gwt.user.client.ui.Label;\n");
+            code.append("import  
com.google.gwt.uibinder.client.UiField;\n");
+            code.append("public class UiFieldsClass {\n");
+            code.append("  @UiField Label label1;");
+            code.append("  @UiField(provided=true) Button button1;");
+            code.append("}\n");
+            return code;
+          }
+        },
+        new MockJavaResource(
+            "com.google.gwt.uibinder.rebind.model.UiHandlersClass") {
+          @Override
+          protected CharSequence getContent() {
+            StringBuffer code = new StringBuffer();
+            code.append("package com.google.gwt.uibinder.rebind.model;\n");
+            code.append("import  
com.google.gwt.event.dom.client.ClickEvent;\n");
+            code.append("import  
com.google.gwt.event.dom.client.MouseOverEvent;\n");
+            code.append("import  
com.google.gwt.uibinder.client.UiHandler;\n");
+            code.append("public class UiHandlersClass {\n");
+            code.append("  @UiHandler(\"myField\") void  
onMyFieldClicked(ClickEvent ev) {}");
+            code.append("  @UiHandler( {\"myField\", \"myOtherField\"})  
void onMouseOver(MouseOverEvent ev){}");
+            code.append("}\n");
+            return code;
+          }
+        },
+        new MockJavaResource(
+            "com.google.gwt.uibinder.rebind.model.BadUiFieldsClass") {
+          @Override
+          protected CharSequence getContent() {
+            StringBuffer code = new StringBuffer();
+            code.append("package com.google.gwt.uibinder.rebind.model;\n");
+            code.append("import  
com.google.gwt.uibinder.client.UiField;\n");
+            code.append("public class BadUiFieldsClass {\n");
+            code.append("  @UiField int thisShouldntWork;");
+            code.append("}\n");
+            return code;
+          }
+        },
+        new MockJavaResource(
+            "com.google.gwt.uibinder.rebind.model.UiFactoryClass") {
+          @Override
+          protected CharSequence getContent() {
+            StringBuffer code = new StringBuffer();
+            code.append("package com.google.gwt.uibinder.rebind.model;\n");
+            code.append("import  
com.google.gwt.uibinder.client.UiFactory;\n");
+            code.append("import com.google.gwt.user.client.ui.Label;\n");
+            code.append("public class UiFactoryClass {");
+            code.append("  @UiFactory");
+            code.append("  Label createLabel() { return null; }");
+            code.append("}\n");
+            return code;
+          }
+        },
+        new  
MockJavaResource("com.google.gwt.uibinder.rebind.model.Abstract") {
+          @Override
+          protected CharSequence getContent() {
+            StringBuffer code = new StringBuffer();
+            code.append("package com.google.gwt.uibinder.rebind.model;\n");
+            code.append("public class Abstract<T> {");
+            code.append("}\n");
+            return code;
+          }
+        },
+        new MockJavaResource(
+            "com.google.gwt.uibinder.rebind.model.WildcardWidgetFactory") {
+          @Override
+          protected CharSequence getContent() {
+            StringBuffer code = new StringBuffer();
+            code.append("package com.google.gwt.uibinder.rebind.model;\n");
+            code.append("import  
com.google.gwt.uibinder.client.UiFactory;\n");
+            code.append("public class WildcardWidgetFactory {");
+            code.append("  @UiFactory");
+            code.append("  Abstract<?> createOne() { return null; }");
+            code.append("}\n");
+            return code;
+          }
+        },
+        new MockJavaResource(
+            "com.google.gwt.uibinder.rebind.model.ParamterizedWidgetFactory")  
{
+          @Override
+          protected CharSequence getContent() {
+            StringBuffer code = new StringBuffer();
+            code.append("package com.google.gwt.uibinder.rebind.model;\n");
+            code.append("import  
com.google.gwt.uibinder.client.UiFactory;\n");
+            code.append("public class ParamterizedWidgetFactory {");
+            code.append("  @UiFactory");
+            code.append("  Abstract<String> createOne() { return null; }");
+            code.append("}\n");
+            return code;
+          }
+        },
+        new MockJavaResource(
+            "com.google.gwt.uibinder.rebind.model.TooManyGenerics") {
+          @Override
+          protected CharSequence getContent() {
+            StringBuffer code = new StringBuffer();
+            code.append("package com.google.gwt.uibinder.rebind.model;\n");
+            code.append("import  
com.google.gwt.uibinder.client.UiFactory;\n");
+            code.append("public class TooManyGenerics {");
+            code.append("  @UiFactory");
+            code.append("  Abstract<?> createSomething() { return null;  
}");
+            code.append("  @UiFactory");
+            code.append("  Abstract<String> createStringThing() { return  
null; }");
+            code.append("}\n");
+            return code;
+          }
+        },
+        new MockJavaResource(
+            "com.google.gwt.uibinder.rebind.model.DuplicateUiFactoryClass")  
{
+          @Override
+          protected CharSequence getContent() {
+            StringBuffer code = new StringBuffer();
+            code.append("package com.google.gwt.uibinder.rebind.model;\n");
+            code.append("import  
com.google.gwt.uibinder.client.UiFactory;\n");
+            code.append("import com.google.gwt.user.client.ui.Label;\n");
+            code.append("public class DuplicateUiFactoryClass {");
+            code.append("  @UiFactory");
+            code.append("  Label labelFactory1() { return null; }");
+            code.append("  @UiFactory");
+            code.append("  Label labelFactory2() { return null; }");
+            code.append("}\n");
+            return code;
+          }
+        },
+        new MockJavaResource(
+            "com.google.gwt.uibinder.rebind.model.ParentUiBinderClass") {
+          @Override
+          protected CharSequence getContent() {
+            StringBuffer code = new StringBuffer();
+            code.append("package com.google.gwt.uibinder.rebind.model;\n");
+            code.append("import  
com.google.gwt.event.dom.client.MouseOverEvent;\n");
+            code.append("import  
com.google.gwt.uibinder.client.UiField;\n");
+            code.append("import  
com.google.gwt.uibinder.client.UiFactory;\n");
+            code.append("import  
com.google.gwt.uibinder.client.UiHandler;\n");
+            code.append("import com.google.gwt.user.client.ui.Label;\n");
+            code.append("public class ParentUiBinderClass {");
+            code.append("  @UiField Label label1;");
+            code.append("  @UiFactory Label createLabel() { return null;  
}");
+            code.append("  @UiHandler(\"label1\")");
+            code.append("  void onLabelMouseOver(MouseOverEvent e) { }");
+            code.append("}\n");
+            return code;
+          }
+        },
+        new MockJavaResource(
+            "com.google.gwt.uibinder.rebind.model.ChildUiBinderClass") {
+          @Override
+          protected CharSequence getContent() {
+            StringBuffer code = new StringBuffer();
+            code.append("package com.google.gwt.uibinder.rebind.model;\n");
+            code.append("import  
com.google.gwt.event.dom.client.ClickEvent;\n");
+            code.append("import  
com.google.gwt.uibinder.client.UiField;\n");
+            code.append("import  
com.google.gwt.uibinder.client.UiFactory;\n");
+            code.append("import  
com.google.gwt.uibinder.client.UiHandler;\n");
+            code.append("import com.google.gwt.user.client.ui.Button;\n");
+            code.append("public class ChildUiBinderClass extends  
ParentUiBinderClass {");
+            code.append("  @UiField(provided = true) Button button1;");
+            code.append("  @UiFactory Button createButton() { return null;  
}");
+            code.append("  @UiHandler(\"button1\")");
+            code.append("  void onButtonClicked(ClickEvent e) { }");
+            code.append("}\n");
+            return code;
+          }
+        },};
+
+    Set<Resource> rtn = new  
HashSet<Resource>(UiJavaResources.getUiResources());
+    rtn.addAll(Arrays.asList(javaFiles));
+    return rtn;
+  }

    @SuppressWarnings("deprecation")
-  public void testOwnerClass_empty() throws Exception {
-    JClassType ownerType =  
gwtTypeAdapter.adaptJavaClass(EmptyOwnerClass.class);
-    JClassType labelType = gwtTypeAdapter.adaptJavaClass(Label.class);
+  public void testOwnerClass_empty() throws UnableToCompleteException {
+    JClassType ownerType =  
types.findType("com.google.gwt.uibinder.rebind.model.EmptyOwnerClass");
      OwnerClass ownerClass = new OwnerClass(ownerType, MortalLogger.NULL);

      assertNull(ownerClass.getUiFactoryMethod(labelType));
@@ -66,24 +283,10 @@
      assertNull(ownerClass.getUiFieldForType(labelType));
      assertTrue(ownerClass.getUiFields().isEmpty());
      assertTrue(ownerClass.getUiHandlers().isEmpty());
-
-    gwtTypeAdapter.verifyAll();
    }

-  /**
-   * Uibinder class for testing of {...@link UiFactory}.
-   */
-  @SuppressWarnings("unused") // We know these methods are unused
-  private static class UiFactoryClass {
-    @UiFactory
-    Label createLabel() {
-      throw new UnsupportedOperationException("Should never be called");
-    }
-  }
-
-  public void testOwnerClass_uiFactory() throws Exception {
-    JClassType ownerType =  
gwtTypeAdapter.adaptJavaClass(UiFactoryClass.class);
-    JClassType labelType = gwtTypeAdapter.adaptJavaClass(Label.class);
+  public void testOwnerClass_uiFactory() throws UnableToCompleteException {
+    JClassType ownerType =  
types.findType("com.google.gwt.uibinder.rebind.model.UiFactoryClass");
      OwnerClass ownerClass = new OwnerClass(ownerType, MortalLogger.NULL);

      JMethod uiFactoryMethod = ownerClass.getUiFactoryMethod(labelType);
@@ -93,78 +296,64 @@
      JParameter[] parameters = uiFactoryMethod.getParameters();
      assertNotNull(parameters);
      assertEquals(0, parameters.length);
-
-    gwtTypeAdapter.verifyAll();
+  }
+
+  public void testParameterizedWidgets() throws UnableToCompleteException {
+    JClassType ownerType =  
types.findType("com.google.gwt.uibinder.rebind.model.ParamterizedWidgetFactory");
+    JClassType abstractType =  
types.findType("com.google.gwt.uibinder.rebind.model.Abstract");
+    OwnerClass ownerClass = new OwnerClass(ownerType, MortalLogger.NULL);
+
+    JMethod expected = ownerType.findMethod("createOne", new JType[] {});
+    JMethod uiFactoryMethod = ownerClass.getUiFactoryMethod(abstractType);
+
+    assertEquals(expected, uiFactoryMethod);
    }

-  /**
-   * Uibinder class for testing bad usage of {...@link UiFactory}.
-   */
-  @SuppressWarnings("unused") // We know these methods are unused
-  private static class BadUiFactoryClass {
-    @UiFactory
-    int thisShouldntWork() {
-      throw new UnsupportedOperationException("Should never be called");
+  public void testWildcardWidgets() throws UnableToCompleteException {
+    JClassType ownerType =  
types.findType("com.google.gwt.uibinder.rebind.model.WildcardWidgetFactory");
+    JClassType abstractType =  
types.findType("com.google.gwt.uibinder.rebind.model.Abstract");
+    OwnerClass ownerClass = new OwnerClass(ownerType, MortalLogger.NULL);
+
+    JMethod expected = ownerType.findMethod("createOne", new JType[] {});
+    JMethod uiFactoryMethod = ownerClass.getUiFactoryMethod(abstractType);
+
+    assertEquals(expected, uiFactoryMethod);
+  }
+
+  public void testHowSuckyWeReallyAreWithGenerics() {
+    JClassType ownerType =  
types.findType("com.google.gwt.uibinder.rebind.model.TooManyGenerics");
+
+    try {
+      new OwnerClass(ownerType, MortalLogger.NULL);
+      fail();
+    } catch (UnableToCompleteException e) {
+      /* pass */
      }
    }

    public void testOwnerClass_uiFactoryBadType() {
-    JClassType ownerType =  
gwtTypeAdapter.adaptJavaClass(BadUiFactoryClass.class);
+    JClassType ownerType =  
types.findType("com.google.gwt.uibinder.rebind.model.BadUiFactoryClass");
      try {
        new OwnerClass(ownerType, MortalLogger.NULL);
        fail("Expected exception not thrown.");
      } catch (UnableToCompleteException utce) {
        // Expected
      }
-
-    gwtTypeAdapter.verifyAll();
-  }
-
-  /**
-   * Uibinder class for testing bad usage of {...@link UiFactory}.
-   */
-  @SuppressWarnings("unused") // We know these methods are unused
-  private static class DuplicateUiFactoryClass {
-    @UiFactory
-    Label labelFactory1() {
-      throw new UnsupportedOperationException("Should never be called");
-    }
-
-    @UiFactory
-    Label labelFactory2() {
-      throw new UnsupportedOperationException("Should never be called");
-    }
    }

    public void testOwnerClass_uiFactoryDuplicateType() {
-    JClassType ownerType =  
gwtTypeAdapter.adaptJavaClass(DuplicateUiFactoryClass.class);
+    JClassType ownerType =  
types.findType("com.google.gwt.uibinder.rebind.model.DuplicateUiFactoryClass");
      try {
        new OwnerClass(ownerType, MortalLogger.NULL);
        fail("Expected exception not thrown.");
      } catch (UnableToCompleteException utce) {
        // Expected
      }
-
-    gwtTypeAdapter.verifyAll();
-  }
-
-  /**
-   * Uibinder class for testing of {...@link UiField}.
-   */
-  @SuppressWarnings("unused") // We know these methods are unused
-  private static class UiFieldsClass {
-    @UiField
-    Label label1;
-
-    @UiField(provided = true)
-    Button button1;
    }

    @SuppressWarnings("deprecation")
-  public void testOwnerClass_uiFields() throws Exception {
-    JClassType ownerType =  
gwtTypeAdapter.adaptJavaClass(UiFieldsClass.class);
-    JClassType labelType = gwtTypeAdapter.adaptJavaClass(Label.class);
-    JClassType buttonType = gwtTypeAdapter.adaptJavaClass(Button.class);
+  public void testOwnerClass_uiFields() throws UnableToCompleteException {
+    JClassType ownerType =  
types.findType("com.google.gwt.uibinder.rebind.model.UiFieldsClass");
      OwnerClass ownerClass = new OwnerClass(ownerType, MortalLogger.NULL);

      OwnerField labelField = ownerClass.getUiField("label1");
@@ -191,56 +380,26 @@
      expectedFieldSet.add(labelField);
      expectedFieldSet.add(buttonField);
      assertEquals(expectedFieldSet, uiFieldSet);
-
-    gwtTypeAdapter.verifyAll();
-  }
-
-  /**
-   * Uibinder class for testing bad usage of {...@link UiField}.
-   */
-  @SuppressWarnings("unused") // We know these methods are unused
-  private static class BadUiFieldsClass {
-    @UiField
-    int thisShouldntWork;
    }

    public void testOwnerClass_uiFieldsBadType() {
-    JClassType ownerType =  
gwtTypeAdapter.adaptJavaClass(BadUiFieldsClass.class);
+    JClassType ownerType =  
types.findType("com.google.gwt.uibinder.rebind.model.BadUiFieldsClass");
      try {
        new OwnerClass(ownerType, MortalLogger.NULL);
        fail("Expected exception not thrown.");
      } catch (UnableToCompleteException utce) {
        // Expected
      }
-
-    gwtTypeAdapter.verifyAll();
    }

-  /**
-   * Uibinder class for testing of {...@link UiHandler}.
-   */
-  @SuppressWarnings("unused") // We know these methods are unused
-  private static class UiHandlersClass {
-    @UiHandler("myField")
-    void onMyFieldClicked(ClickEvent ev) {
-      throw new UnsupportedOperationException("Should never be called");
-    }
-
-    @UiHandler({"myField", "myOtherField"})
-    void onMouseOver(MouseOverEvent ev) {
-      throw new UnsupportedOperationException("Should never be called");
-    }
-  }
-
-  public void testOwnerClass_uiHandlers() throws Exception {
-    JClassType ownerType =  
gwtTypeAdapter.adaptJavaClass(UiHandlersClass.class);
+  public void testOwnerClass_uiHandlers() throws UnableToCompleteException  
{
+    JClassType ownerType =  
types.findType("com.google.gwt.uibinder.rebind.model.UiHandlersClass");
      OwnerClass ownerClass = new OwnerClass(ownerType, MortalLogger.NULL);

      // Assert the two expected handlers are there
      List<JMethod> uiHandlers = ownerClass.getUiHandlers();
      assertEquals(2, uiHandlers.size());
-    JMethod clickMethod = null,
-        mouseOverMethod = null;
+    JMethod clickMethod = null, mouseOverMethod = null;

      // Don't care about ordering
      for (JMethod method : uiHandlers) {
@@ -255,7 +414,6 @@
      assertNotNull(mouseOverMethod);

      // Check the click handler
-    JClassType clickEventType =  
gwtTypeAdapter.adaptJavaClass(ClickEvent.class);
      JParameter[] clickParams = clickMethod.getParameters();
      assertEquals(1, clickParams.length);
      assertEquals(clickEventType, clickParams[0].getType());
@@ -266,7 +424,6 @@
      assertEquals("myField", clickFields[0]);

      // Check the mouse over handler
-    JClassType mouseOverEventType =  
gwtTypeAdapter.adaptJavaClass(MouseOverEvent.class);
      JParameter[] mouseOverParams = mouseOverMethod.getParameters();
      assertEquals(1, mouseOverParams.length);
      assertEquals(mouseOverEventType, mouseOverParams[0].getType());
@@ -276,54 +433,11 @@
      assertEquals(2, mouseOverFields.length);
      assertEquals("myField", mouseOverFields[0]);
      assertEquals("myOtherField", mouseOverFields[1]);
-
-    gwtTypeAdapter.verifyAll();
-  }
-
-  /**
-   * Parent class for testing inheritance of owner classes.
-   */
-  @SuppressWarnings("unused") // We know these methods are unused
-  private static class ParentUiBinderClass {
-    @UiField
-    Label label1;
-
-    @UiFactory
-    Label createLabel() {
-      throw new UnsupportedOperationException("Should never be called");
-    }
-
-    @UiHandler("label1")
-    void onLabelMouseOver(MouseOverEvent ev) {
-      throw new UnsupportedOperationException("Should never be called");
-    }
-  }
-
-  /**
-   * Child class for testing inheritance of owner classes.
-   */
-  @SuppressWarnings("unused") // We know these methods are unused
-  private static class ChildUiBinderClass extends ParentUiBinderClass {
-    @UiField(provided = true)
-    Button button1;
-
-    @UiFactory
-    Button createButton() {
-      throw new UnsupportedOperationException("Should never be called");
-    }
-
-    @UiHandler("button1")
-    void onButtonClicked(ClickEvent ev) {
-      throw new UnsupportedOperationException("Should never be called");
-    }
    }

    @SuppressWarnings("deprecation")
-  public void testOwnerClass_withParent() throws Exception {
-    JClassType ownerType =
-        gwtTypeAdapter.adaptJavaClass(ChildUiBinderClass.class);
-    JClassType labelType = gwtTypeAdapter.adaptJavaClass(Label.class);
-    JClassType buttonType = gwtTypeAdapter.adaptJavaClass(Button.class);
+  public void testOwnerClass_withParent() throws UnableToCompleteException  
{
+    JClassType ownerType =  
types.findType("com.google.gwt.uibinder.rebind.model.ChildUiBinderClass");
      OwnerClass ownerClass = new OwnerClass(ownerType, MortalLogger.NULL);

      // Test fields
@@ -372,8 +486,7 @@
      // Test handlers
      List<JMethod> uiHandlers = ownerClass.getUiHandlers();
      assertEquals(2, uiHandlers.size());
-    JMethod clickMethod = null,
-        mouseOverMethod = null;
+    JMethod clickMethod = null, mouseOverMethod = null;

      for (JMethod method : uiHandlers) {
        if (method.getName().equals("onButtonClicked")) {
@@ -386,7 +499,6 @@
      assertNotNull(clickMethod);
      assertNotNull(mouseOverMethod);

-    JClassType clickEventType =  
gwtTypeAdapter.adaptJavaClass(ClickEvent.class);
      JParameter[] clickParams = clickMethod.getParameters();
      assertEquals(1, clickParams.length);
      assertEquals(clickEventType, clickParams[0].getType());
@@ -396,7 +508,6 @@
      assertEquals(1, clickFields.length);
      assertEquals("button1", clickFields[0]);

-    JClassType mouseOverEventType =  
gwtTypeAdapter.adaptJavaClass(MouseOverEvent.class);
      JParameter[] mouseOverParams = mouseOverMethod.getParameters();
      assertEquals(1, mouseOverParams.length);
      assertEquals(mouseOverEventType, mouseOverParams[0].getType());
@@ -405,7 +516,5 @@
      String[] mouseOverFields = mouseOverAnnotation.value();
      assertEquals(1, mouseOverFields.length);
      assertEquals("label1", mouseOverFields[0]);
-
-    gwtTypeAdapter.verifyAll();
    }
  }
=======================================
--- /trunk/user/test/com/google/gwt/uibinder/test/UiJavaResources.java  Thu  
Nov 19 12:57:33 2009
+++ /trunk/user/test/com/google/gwt/uibinder/test/UiJavaResources.java  Thu  
Nov 19 13:38:23 2009
@@ -29,6 +29,49 @@
   */
  public class UiJavaResources {

+  public static final MockJavaResource BUTTON = new MockJavaResource(
+      "com.google.gwt.user.client.ui.Button") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.user.client.ui;\n");
+      code.append("import com.google.gwt.event.dom.client.ClickEvent;\n");
+      code.append("import  
com.google.gwt.event.dom.client.ClickHandler;\n");
+      code.append("import  
com.google.gwt.event.dom.client.MouseOverEvent;\n");
+      code.append("import  
com.google.gwt.event.dom.client.MouseOverHandler;\n");
+      code.append("public class Button extends Widget");
+      code.append("  implements ClickHandler, MouseOverHandler {\n");
+      code.append("  public void onMouseOver(MouseOverEvent event){}\n");
+      code.append("  public void onClick(ClickEvent event){}\n");
+      code.append("}\n");
+      return code;
+    }
+  };
+  public static final MockJavaResource CLICK_EVENT = new MockJavaResource(
+      "com.google.gwt.event.dom.client.ClickEvent") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.event.dom.client;\n");
+      code.append("import com.google.gwt.event.shared.GwtEvent;\n");
+      code.append("public class ClickEvent extends GwtEvent<ClickHandler>  
{\n");
+      code.append("}\n");
+      return code;
+    }
+  };
+  public static final MockJavaResource CLICK_HANDLER = new  
MockJavaResource(
+      "com.google.gwt.event.dom.client.ClickHandler") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.event.dom.client;\n");
+      code.append("import com.google.gwt.event.shared.EventHandler;\n");
+      code.append("public interface ClickHandler extends EventHandler  
{\n");
+      code.append("  void onClick(ClickEvent event);\n");
+      code.append("}\n");
+      return code;
+    }
+  };
    public static final MockJavaResource DIALOG_BOX = new MockJavaResource(
        "com.google.gwt.user.client.ui.DialogBox") {
      @Override
@@ -50,6 +93,53 @@
        code.append("}\n");
        return code;
      }
+  };
+  public static final MockJavaResource EVENT_HANDLER = new  
MockJavaResource(
+      "com.google.gwt.event.shared.EventHandler") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.event.shared;\n");
+      code.append("public interface EventHandler {\n");
+      code.append("}\n");
+      return code;
+    }
+  };
+  public static final MockJavaResource GWT_EVENT = new MockJavaResource(
+      "com.google.gwt.event.shared.GwtEvent") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.event.shared;\n");
+      code.append("public abstract class GwtEvent<H extends EventHandler>  
{\n");
+      code.append("}\n");
+      return code;
+    }
+  };
+  public static final MockJavaResource HANDLER_REGISTRATION = new  
MockJavaResource(
+      "com.google.gwt.event.shared.HandlerRegistration") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.event.shared;\n");
+      code.append("public interface HandlerRegistration {\n");
+      code.append("  void removeHandler();");
+      code.append("}\n");
+      return code;
+    }
+  };
+  public static final MockJavaResource HAS_CLICK_HANDLERS = new  
MockJavaResource(
+      "com.google.gwt.event.dom.client.HasClickHandlers") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.event.dom.client;\n");
+      code.append("import  
com.google.gwt.event.shared.HandlerRegistration;\n");
+      code.append("public interface HasClickHandlers {\n");
+      code.append("  HandlerRegistration addClickHandler(ClickHandler  
handler);");
+      code.append("}\n");
+      return code;
+    }
    };
    public static final MockJavaResource HAS_HORIZONTAL_ALIGNMENT = new  
MockJavaResource(
        "com.google.gwt.user.client.ui.HasHorizontalAlignment") {
@@ -83,7 +173,14 @@
      protected CharSequence getContent() {
        StringBuffer code = new StringBuffer();
        code.append("package com.google.gwt.user.client.ui;\n");
-      code.append("public class Label extends Widget {\n");
+      code.append("import com.google.gwt.event.dom.client.ClickEvent;\n");
+      code.append("import  
com.google.gwt.event.dom.client.ClickHandler;\n");
+      code.append("import  
com.google.gwt.event.dom.client.MouseOverEvent;\n");
+      code.append("import  
com.google.gwt.event.dom.client.MouseOverHandler;\n");
+      code.append("public class Label extends Widget");
+      code.append("  implements ClickHandler, MouseOverHandler {\n");
+      code.append("  public void onMouseOver(MouseOverEvent event){}\n");
+      code.append("  public void onClick(ClickEvent event){}\n");
        code.append("}\n");
        return code;
      }
@@ -98,6 +195,31 @@
        code.append("}\n");
        return code;
      }
+  };
+  public static final MockJavaResource MOUSE_OVER_EVENT = new  
MockJavaResource(
+      "com.google.gwt.event.dom.client.MouseOverEvent") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.event.dom.client;\n");
+      code.append("import com.google.gwt.event.shared.GwtEvent;\n");
+      code.append("public class MouseOverEvent extends  
GwtEvent<MouseOverHandler> {\n");
+      code.append("}\n");
+      return code;
+    }
+  };
+  public static final MockJavaResource MOUSE_OVER_HANDLER = new  
MockJavaResource(
+      "com.google.gwt.event.dom.client.MouseOverHandler") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.event.dom.client;\n");
+      code.append("import com.google.gwt.event.shared.EventHandler;\n");
+      code.append("public interface MouseOverHandler extends EventHandler  
{\n");
+      code.append("  void onMouseOver(MouseOverEvent event);\n");
+      code.append("}\n");
+      return code;
+    }
    };
    public static final MockJavaResource SPLIT_LAYOUT_PANEL = new  
MockJavaResource(
        "com.google.gwt.user.client.ui.SplitLayoutPanel") {
@@ -154,6 +276,19 @@
        code.append("}\n");
        return code;
      }
+  };
+  public static final MockJavaResource UI_FACTORY = new MockJavaResource(
+      "com.google.gwt.uibinder.client.UiFactory") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package com.google.gwt.uibinder.client;\n");
+      code.append("import java.lang.annotation.Target;\n");
+      // code.append("@Target(ElementType.METHOD)");
+      code.append("public @interface UiFactory {\n");
+      code.append("}\n");
+      return code;
+    }
    };
    public static final MockJavaResource UI_OBJECT = new MockJavaResource(
        "com.google.gwt.user.client.ui.UIObject") {
@@ -185,18 +320,28 @@
    public static Set<Resource> getUiResources() {
      Set<Resource> rtn = new HashSet<Resource>(
          Arrays.asList(JavaResourceBase.getStandardResources()));
+    rtn.add(BUTTON);
+    rtn.add(CLICK_EVENT);
+    rtn.add(CLICK_HANDLER);
      rtn.add(DIALOG_BOX);
      rtn.add(DOCK_LAYOUT_PANEL);
+    rtn.add(EVENT_HANDLER);
+    rtn.add(GWT_EVENT);
+    rtn.add(HANDLER_REGISTRATION);
+    rtn.add(HAS_CLICK_HANDLERS);
      rtn.add(HAS_HORIZONTAL_ALIGNMENT);
      rtn.add(HAS_VERTICAL_ALIGNMENT);
      rtn.add(LABEL);
      rtn.add(LAYOUT_PANEL);
+    rtn.add(MOUSE_OVER_EVENT);
+    rtn.add(MOUSE_OVER_HANDLER);
      rtn.add(SPLIT_LAYOUT_PANEL);
      rtn.add(STACK_LAYOUT_PANEL);
      rtn.add(STYLE);
      rtn.add(TAB_LAYOUT_PANEL);
      rtn.add(UI_OBJECT);
      rtn.add(UI_BINDER);
+    rtn.add(UI_FACTORY);
      rtn.add(WIDGET);
      return rtn;
    }

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

Reply via email to