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