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
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10127 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/src/com/google/gwt/uibinder/rebind/AbstractFieldWriter.java b/user/src/com/google/gwt/uibinder/rebind/AbstractFieldWriter.java
index ecb25e5..8eb5814 100644
--- a/user/src/com/google/gwt/uibinder/rebind/AbstractFieldWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/AbstractFieldWriter.java
@@ -58,15 +58,17 @@
private String initializer;
private boolean written;
private int buildPrecedence;
- private MortalLogger logger;
+ private final MortalLogger logger;
+ private final FieldWriterType fieldType;
- public AbstractFieldWriter(String name, MortalLogger logger) {
+ 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
@@ -89,6 +91,11 @@
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);
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldManager.java b/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
index 158618e..5abd2a9 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldManager.java
@@ -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)
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldWriter.java b/user/src/com/google/gwt/uibinder/rebind/FieldWriter.java
index 7cfab03..6ed3527 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldWriter.java
@@ -94,6 +94,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.
*/
String getInitializer();
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfExistingType.java b/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfExistingType.java
index b7aa445..a9df6e7 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfExistingType.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfExistingType.java
@@ -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");
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResource.java b/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResource.java
index 315ae19..6d074b7 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResource.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResource.java
@@ -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());
}
}
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedType.java b/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedType.java
index 1cd3a1c..5b353b8 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedType.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedType.java
@@ -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");
}
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldWriterType.java b/user/src/com/google/gwt/uibinder/rebind/FieldWriterType.java
new file mode 100644
index 0000000..2747e24
--- /dev/null
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldWriterType.java
@@ -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;
+ }
+}
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
index 4cf8a47..ab6b5ad 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderParser.java
@@ -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 */
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
index f0fd59b..1496c59 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
@@ -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 {
diff --git a/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResourceTest.java b/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResourceTest.java
index 4e2f10e..9fc1691 100644
--- a/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResourceTest.java
+++ b/user/test/com/google/gwt/uibinder/rebind/FieldWriterOfGeneratedCssResourceTest.java
@@ -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());
}
}