Revision: 10127
Author:   [email protected]
Date:     Mon May  2 12:52:38 2011
Log: Introducing FieldTypeWriter, an enum that identifies field writers and
defines precedences useful for disambiguation when sorting builders
in the Widgets ctor.

Review at http://gwt-code-reviews.appspot.com/1428807

http://code.google.com/p/google-web-toolkit/source/detail?r=10127

Added:
 /trunk/user/src/com/google/gwt/uibinder/rebind/FieldWriterType.java
Modified:
 /trunk/user/src/com/google/gwt/uibinder/rebind/AbstractFieldWriter.java
 /trunk/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
 /trunk/user/src/com/google/gwt/uibinder/rebind/FieldWriter.java
/trunk/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfExistingType.java /trunk/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResource.java /trunk/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedType.java
 /trunk/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
 /trunk/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
/trunk/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResourceTest.java

=======================================
--- /dev/null
+++ /trunk/user/src/com/google/gwt/uibinder/rebind/FieldWriterType.java Mon May 2 12:52:38 2011
@@ -0,0 +1,43 @@
+/*
+ * 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.rebind;
+
+/**
+ * A simple enum holding all FieldWriter types.
+ */
+enum FieldWriterType {
+
+  GENERATED_BUNDLE(4),
+  GENERATED_CSS(3),
+  IMPORTED(2),  // ui:with clauses.
+  DEFAULT(1);
+
+  /**
+ * Holds the build precedence for this type. This is used when sorting the
+   * field builders in the Widgets constructor.
+   * {@see com.google.gwt.uibinder.rebind.initializeWidgetsInnerClass}
+   */
+  private int buildPrecedence;
+
+  private FieldWriterType(int precedence) {
+    this.buildPrecedence = precedence;
+  }
+
+  public int getBuildPrecedence() {
+    return buildPrecedence;
+  }
+}
=======================================
--- /trunk/user/src/com/google/gwt/uibinder/rebind/AbstractFieldWriter.java Thu Apr 28 10:23:18 2011 +++ /trunk/user/src/com/google/gwt/uibinder/rebind/AbstractFieldWriter.java Mon May 2 12:52:38 2011
@@ -58,15 +58,17 @@
   private String initializer;
   private boolean written;
   private int buildPrecedence;
-  private MortalLogger logger;
-
-  public AbstractFieldWriter(String name, MortalLogger logger) {
+  private final MortalLogger logger;
+  private final FieldWriterType fieldType;
+
+ public AbstractFieldWriter(String name, FieldWriterType fieldType, MortalLogger logger) {
     if (name == null) {
       throw new RuntimeException("name cannot be null");
     }
     this.name = name;
     this.logger = logger;
     this.buildPrecedence = 1;
+    this.fieldType = fieldType;
   }

   @Override
@@ -88,6 +90,11 @@
   public int getBuildPrecedence() {
     return buildPrecedence;
   }
+
+  @Override
+  public FieldWriterType getFieldType() {
+    return fieldType;
+  }

   public String getInitializer() {
     return initializer;
@@ -165,14 +172,15 @@
   public void writeFieldBuilder(IndentedWriter w, int getterCount,
     OwnerField ownerField) throws UnableToCompleteException {
     if (getterCount > 1) {
-      w.write("%s;  // more than one getter call detected. Precedence: %s",
-            FieldManager.getFieldBuilder(name), getBuildPrecedence());
+ w.write("%s; // more than one getter call detected. Type: %s, precedence: %s", + FieldManager.getFieldBuilder(name), getFieldType(), getBuildPrecedence());
       return;
     }

     if (getterCount == 0 && ownerField != null) {
- w.write("%s; // no getter call detected but must bind to ui:field. Precedence: %s",
-          FieldManager.getFieldBuilder(name), getBuildPrecedence());
+      w.write("%s;  // no getter call detected but must bind to ui:field. "
+          + "Type: %s, precedence: %s", FieldManager.getFieldBuilder(name),
+          getFieldType(), getBuildPrecedence());
     }
   }

@@ -208,8 +216,8 @@

     w.newline();
     w.write("/**");
-    w.write(" * Getter for %s called %s times. Build precedence: %s.",
-        name, getterCount, getBuildPrecedence());
+ w.write(" * Getter for %s called %s times. Type: %s. Build precedence: %s.",
+        name, getterCount, getFieldType(), getBuildPrecedence());
     w.write(" */");
     if (getterCount > 1) {
       w.write("private %1$s %2$s;", getQualifiedSourceName(), name);
=======================================
--- /trunk/user/src/com/google/gwt/uibinder/rebind/FieldManager.java Wed Apr 27 13:54:04 2011 +++ /trunk/user/src/com/google/gwt/uibinder/rebind/FieldManager.java Mon May 2 12:52:38 2011
@@ -42,7 +42,13 @@
   private static final Comparator<FieldWriter> BUILD_DEFINITION_SORT =
       new Comparator<FieldWriter>() {
     public int compare(FieldWriter field1, FieldWriter field2) {
-      return field2.getBuildPrecedence() - field1.getBuildPrecedence();
+      // First get type precedence, if ties the field precedence is used.
+      int precedence = field2.getFieldType().getBuildPrecedence()
+          - field1.getFieldType().getBuildPrecedence();
+      if (precedence == 0) {
+ precedence = field2.getBuildPrecedence() - field1.getBuildPrecedence();
+      }
+      return precedence;
     }
   };

@@ -158,16 +164,22 @@
* fields (see {@link UiBinderWriter#declareDomIdHolder()}) used by an HTMLPanel
    * will be declared before it is.
    *
+   * @param fieldWriterType the field writer type associated
    * @param fieldType the type of the new field
    * @param fieldName the name of the new field
    * @return a new {@link FieldWriter} instance
    * @throws UnableToCompleteException on duplicate name
    */
+  public FieldWriter registerField(FieldWriterType fieldWriterType,
+ JClassType fieldType, String fieldName) throws UnableToCompleteException {
+    FieldWriter field = new FieldWriterOfExistingType(
+        fieldWriterType, fieldType, fieldName, logger);
+    return registerField(fieldName, field);
+  }
+
   public FieldWriter registerField(JClassType fieldType, String fieldName)
       throws UnableToCompleteException {
-    FieldWriter field = new FieldWriterOfExistingType(fieldType, fieldName,
-        logger);
-    return registerField(fieldName, field);
+    return registerField(FieldWriterType.DEFAULT, fieldType, fieldName);
   }

   public FieldWriter registerField(String type, String fieldName)
=======================================
--- /trunk/user/src/com/google/gwt/uibinder/rebind/FieldWriter.java Wed Apr 27 13:54:04 2011 +++ /trunk/user/src/com/google/gwt/uibinder/rebind/FieldWriter.java Mon May 2 12:52:38 2011
@@ -93,6 +93,11 @@
    */
   int getBuildPrecedence();

+  /**
+   * Gets the type of this field.
+   */
+  FieldWriterType getFieldType();
+
   /**
* Returns the custom initializer for this field, or null if it is not set.
    */
=======================================
--- /trunk/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfExistingType.java Mon Apr 19 07:56:12 2010 +++ /trunk/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfExistingType.java Mon May 2 12:52:38 2011
@@ -26,8 +26,9 @@
   final JClassType type;
   final MortalLogger logger;

- FieldWriterOfExistingType(JClassType type, String name, MortalLogger logger) {
-    super(name, logger);
+  FieldWriterOfExistingType(FieldWriterType fieldType,
+      JClassType type, String name, MortalLogger logger) {
+    super(name, fieldType, logger);
     this.logger = logger;
     if (type == null) {
       throw new IllegalArgumentException("type cannot be null");
=======================================
--- /trunk/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResource.java Thu Apr 28 03:49:08 2011 +++ /trunk/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResource.java Mon May 2 12:52:38 2011
@@ -35,7 +35,7 @@

   public FieldWriterOfGeneratedCssResource(JType stringType,
       ImplicitCssResource css, MortalLogger logger) {
-    super(css.getName(), logger);
+    super(css.getName(), FieldWriterType.GENERATED_CSS, logger);
     this.stringType = stringType;
     this.css = css;
   }
@@ -74,7 +74,7 @@
   @Override
   public void writeFieldBuilder(IndentedWriter w,
int getterCount, OwnerField ownerField) throws UnableToCompleteException { - w.write("%s; // generated css resource must be always created. Precedence: %s",
-        FieldManager.getFieldBuilder(getName()), getBuildPrecedence());
+ w.write("%s; // generated css resource must be always created. Type: %s. Precedence: %s", + FieldManager.getFieldBuilder(getName()), getFieldType(), getBuildPrecedence());
   }
 }
=======================================
--- /trunk/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedType.java Wed Nov 11 22:08:47 2009 +++ /trunk/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedType.java Mon May 2 12:52:38 2011
@@ -27,9 +27,9 @@
   private final String typeName;
   private final JClassType assignableType;

-  public FieldWriterOfGeneratedType(JClassType assignableType,
- String typePackage, String typeName, String name, MortalLogger logger) {
-    super(name, logger);
+ public FieldWriterOfGeneratedType(JClassType assignableType, String typePackage,
+      String typeName, String name, MortalLogger logger) {
+    super(name, FieldWriterType.GENERATED_BUNDLE, logger);
     if (assignableType == null) {
       throw new RuntimeException("assignableType must not be null");
     }
=======================================
--- /trunk/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java Fri Apr 22 11:18:50 2011 +++ /trunk/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java Mon May 2 12:52:38 2011
@@ -259,8 +259,8 @@
writer.die(elem, "Should only find attributes \"field\" and \"type\"");
     }

-    FieldWriter fieldWriter = fieldManager.registerField(resourceType,
-        resourceName);
+    FieldWriter fieldWriter = fieldManager.registerField(
+        FieldWriterType.IMPORTED, resourceType, resourceName);
OwnerField ownerField = writer.getOwnerClass().getUiField(resourceName);

     /* Perhaps it is provided via @UiField */
=======================================
--- /trunk/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java Mon May 2 08:12:13 2011 +++ /trunk/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java Mon May 2 12:52:38 2011
@@ -1083,8 +1083,7 @@
     fieldManager.registerFieldOfGeneratedType(
         oracle.findType(ClientBundle.class.getName()),
         bundleClass.getPackageName(), bundleClass.getClassName(),
-        bundleClass.getFieldName())
- .setBuildPrecedence(Integer.MAX_VALUE); // must be the first thing built.
+        bundleClass.getFieldName());

     // Allow GWT.create() to init the field, the default behavior

@@ -1102,7 +1101,6 @@
         String fieldName = css.getName();
         FieldWriter cssField = fieldManager.require(fieldName);
         cssField.addStatement("%s.ensureInjected();", fieldName);
- cssField.setBuildPrecedence(Integer.MAX_VALUE - 1); // must be just below its bundle.
       }
       writeBinderForAttachableStrategy(niceWriter, rootField);
     } else {
=======================================
--- /trunk/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResourceTest.java Fri Nov 20 13:09:39 2009 +++ /trunk/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResourceTest.java Mon May 2 12:52:38 2011
@@ -63,6 +63,7 @@

     assertEquals(stringType, f.getReturnType(new String[] {
         "fieldName", "ableBaker"}, new MonitoredLogger(TreeLogger.NULL)));
+    assertEquals(FieldWriterType.GENERATED_CSS, f.getFieldType());
   }

   public void testDashesMatchesCamels() {
@@ -78,5 +79,7 @@

     assertEquals(stringType, f.getReturnType(new String[] {
         "fieldName", "able-baker"}, new MonitoredLogger(TreeLogger.NULL)));
+
+    assertEquals(FieldWriterType.GENERATED_CSS, f.getFieldType());
   }
 }

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

Reply via email to