Reviewers: ,

Description:
Issue 6267: EditorDriver implementations do not recognise boolean
accessors with the prefix "is" (as opposed to "get"). This patch makes
EditorDrivers search for an "is" accessor when no "get" accessor is
found.

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

Affected files:
  dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java
  user/src/com/google/gwt/editor/rebind/model/EditorModel.java
  user/test/com/google/gwt/editor/rebind/model/EditorModelTest.java


Index: dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java
===================================================================
--- dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java (revision 10022) +++ dev/core/test/com/google/gwt/dev/javac/impl/JavaResourceBase.java (working copy)
@@ -42,6 +42,22 @@
       return code;
     }
   };
+ public static final MockJavaResource BOOLEAN = new MockJavaResource("java.lang.Boolean") {
+    @Override
+    protected CharSequence getContent() {
+      StringBuffer code = new StringBuffer();
+      code.append("package java.lang;\n");
+      code.append("public class Boolean {\n");
+      code.append("  private boolean value;\n");
+      code.append("  public Boolean(boolean value) {\n");
+      code.append("    this.value = value;\n");
+      code.append("  }\n");
+ code.append(" public static Boolean valueOf(boolean b) { return new Boolean(b); }\n");
+      code.append("  public boolean booleanValue() { return value; }\n");
+      code.append("}\n");
+      return code;
+    }
+  };
   public static final MockJavaResource BYTE = new MockJavaResource(
       "java.lang.Byte") {
     @Override
@@ -401,7 +417,7 @@

   public static MockJavaResource[] getStandardResources() {
     return new MockJavaResource[]{
-        ANNOTATION, BYTE, CHARACTER, CLASS, CLASS_NOT_FOUND_EXCEPTION,
+ ANNOTATION, BOOLEAN, BYTE, CHARACTER, CLASS, CLASS_NOT_FOUND_EXCEPTION,
         COLLECTION, DOUBLE, ENUM, EXCEPTION, ERROR, FLOAT, INTEGER,
IS_SERIALIZABLE, JAVASCRIPTOBJECT, LONG, MAP, NO_CLASS_DEF_FOUND_ERROR,
         NUMBER, OBJECT, SERIALIZABLE, SHORT, STRING, STRING_BUILDER,
Index: user/test/com/google/gwt/editor/rebind/model/EditorModelTest.java
===================================================================
--- user/test/com/google/gwt/editor/rebind/model/EditorModelTest.java (revision 10022) +++ user/test/com/google/gwt/editor/rebind/model/EditorModelTest.java (working copy)
@@ -187,7 +187,7 @@
         types.findType("t.CompositeEditorDriver"), rfedType);

     EditorData[] data = m.getEditorData();
-    assertEquals(7, data.length);
+    assertEquals(8, data.length);

     String[] paths = new String[data.length];
     String[] expressions = new String[data.length];
@@ -196,19 +196,20 @@
       expressions[i] = data[i].getExpression();
     }
     assertEquals(Arrays.asList("address", "address.city", "address.street",
-        "person", "person.lastModified", "person.name", "person.readonly"),
-        Arrays.asList(paths));
+        "person", "person.alive", "person.lastModified", "person.name",
+        "person.readonly"), Arrays.asList(paths));
     // address is a property, person is a method in CompositeEditor
     assertEquals(Arrays.asList("address", "address.city", "address.street",
-        "person()", "person().lastModified", "person().name",
+        "person()", "person().alive", "person().lastModified", "person().name",
         "person().readonly"), Arrays.asList(expressions));
     assertTrue(data[0].isDelegateRequired());
assertFalse(data[0].isLeafValueEditor() || data[0].isValueAwareEditor());
     assertTrue(data[3].isDelegateRequired());
assertFalse(data[3].isLeafValueEditor() || data[3].isValueAwareEditor());
-    checkPersonLastModified(data[4]);
-    checkPersonName(data[5]);
-    checkPersonReadonly(data[6]);
+    checkPersonAlive(data[4]);
+    checkPersonLastModified(data[5]);
+    checkPersonName(data[6]);
+    checkPersonReadonly(data[7]);
   }

   public void testCyclicDriver() {
@@ -258,14 +259,16 @@
     EditorModel m = new EditorModel(logger,
         types.findType("t.PersonEditorDriver"), rfedType);
     EditorData[] fields = m.getEditorData();
-    assertEquals(3, fields.length);
+    assertEquals(4, fields.length);

+    // alive
+    checkPersonAlive(fields[0]);
     // lastModified
-    checkPersonLastModified(fields[0]);
+    checkPersonLastModified(fields[1]);
     // name
-    checkPersonName(fields[1]);
+    checkPersonName(fields[2]);
     // readonly
-    checkPersonReadonly(fields[2]);
+    checkPersonReadonly(fields[3]);
   }

   public void testFlatData() throws UnableToCompleteException {
@@ -281,10 +284,11 @@
     assertEquals("person", composite[1].getPropertyName());

EditorData[] person = m.getEditorData(types.findType("t.PersonEditor"));
-    assertEquals(3, person.length);
-    assertEquals("lastModified", person[0].getPropertyName());
-    assertEquals("name", person[1].getPropertyName());
-    assertEquals("readonly", person[2].getPropertyName());
+    assertEquals(4, person.length);
+    assertEquals("alive", person[0].getPropertyName());
+    assertEquals("lastModified", person[1].getPropertyName());
+    assertEquals("name", person[2].getPropertyName());
+    assertEquals("readonly", person[3].getPropertyName());

EditorData[] address = m.getEditorData(types.findType("t.AddressEditor"));
     assertEquals("city", address[0].getPropertyName());
@@ -464,9 +468,20 @@
     EditorModel m = new EditorModel(logger,
types.findType("t.PersonEditorWithAliasedSubEditorsDriver"), rfedType);
     EditorData[] fields = m.getEditorData();
-    assertEquals(8, fields.length);
+    assertEquals(10, fields.length);
   }

+  private void checkPersonAlive(EditorData editorField) {
+    assertNotNull(editorField);
+    assertEquals(types.findType(SimpleEditor.class.getName()),
+        editorField.getEditorType().isParameterized().getBaseType());
+    assertTrue(editorField.isLeafValueEditor());
+    assertFalse(editorField.isDelegateRequired());
+    assertFalse(editorField.isValueAwareEditor());
+    assertEquals(".isAlive()", editorField.getGetterExpression());
+    assertEquals("setAlive", editorField.getSetterName());
+  }
+
   private void checkPersonLastModified(EditorData editorField) {
     assertNotNull(editorField);
     assertEquals(types.findType(SimpleEditor.class.getName()),
@@ -477,7 +492,7 @@
     assertEquals(".getLastModified()", editorField.getGetterExpression());
     assertEquals("setLastModified", editorField.getSetterName());
   }
-
+
   private void checkPersonName(EditorData editorField) {
     assertNotNull(editorField);
     assertEquals(types.findType(SimpleEditor.class.getName()),
@@ -666,9 +681,11 @@
         code.append("import " + EntityProxy.class.getName() + ";\n");
         code.append("interface PersonProxy extends EntityProxy {\n");
         code.append("AddressProxy getAddress();\n");
+        code.append("boolean isAlive();\n");
         code.append("String getName();\n");
         code.append("long getLastModified();\n");
         code.append("String getReadonly();\n");
+        code.append("void setAlive(boolean alive);\n");
         code.append("void setName(String name);\n");
         code.append("void setLastModified(long value);\n");
         code.append("}");
@@ -682,6 +699,7 @@
         code.append("import " + Editor.class.getName() + ";\n");
         code.append("import " + SimpleEditor.class.getName() + ";\n");
code.append("class PersonEditor implements Editor<PersonProxy> {\n");
+        code.append("SimpleEditor<Boolean> alive;\n");
         code.append("SimpleEditor<Long> lastModified;\n");
         code.append("public SimpleEditor<String> name;\n");
         code.append("SimpleEditor<String> readonly;\n");
Index: user/src/com/google/gwt/editor/rebind/model/EditorModel.java
===================================================================
--- user/src/com/google/gwt/editor/rebind/model/EditorModel.java (revision 10022) +++ user/src/com/google/gwt/editor/rebind/model/EditorModel.java (working copy)
@@ -471,7 +471,6 @@
         continue;
       }
       boolean lastPart = i == j - 1;
-      String getterName = camelCase("get", parts[i]);

for (JClassType search : lookingAt.getFlattenedSupertypeHierarchy()) { // If looking at the last element of the path, also look for a setter
@@ -496,7 +495,12 @@
           }
         }

+        String getterName = camelCase("get", parts[i]);
         JMethod getter = search.findMethod(getterName, new JType[0]);
+        if (getter == null) {
+          getterName = camelCase("is", parts[i]);
+          getter = search.findMethod(getterName, new JType[0]);
+        }
         if (getter != null) {
           JType returnType = getter.getReturnType();
           lookingAt = returnType.isClassOrInterface();


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

Reply via email to