XmlTypeWriter xtw = type.annotate2(XmlTypeWriter.class);
writeTypeName(e.getTypeName(), xtw,
eo._package().getMostUsedNamespaceURI());
JCodeModel codeModel = model.codeModel;
// since constant values are never null, no point in using the boxed types.
JType baseExposedType = e.base.toType(this, EXPOSED).unboxify();
JType baseImplType = e.base.toType(this,Aspect.IMPLEMENTATION).unboxify();
XmlEnumWriter xew = type.annotate2(XmlEnumWriter.class);
xew.value(baseExposedType);
boolean needsValue = e.needsValueField();
// for each member <m>,
// [RESULT]
// <EnumName>(<deserializer of m>(<value>));
Set<String> enumFieldNames = new HashSet<String>(); // record generated field names to detect collision
for( CEnumConstant mem : e.members ) {
String constName = mem.getName();
if(!JJavaName.isJavaIdentifier(constName)) {
// didn't produce a name.
getErrorReceiver().error( e.getLocator(),
Messages.ERR_UNUSABLE_NAME.format(mem.getLexicalValue(), constName ) );
}
if( !enumFieldNames.add(constName) )
getErrorReceiver().error( e.getLocator(), Messages.ERR_NAME_COLLISION.format(constName));
// [RESULT]
// <Const>(...)
// ASSUMPTION: datatype is outline-independent
JEnumConstant constRef = type.enumConstant(constName);
if(needsValue)
constRef.arg(e.base.createConstant(this, new XmlString(mem.getLexicalValue())));
if(!mem.getLexicalValue().equals(constName))
constRef.annotate2(XmlEnumValueWriter.class).value(mem.getLexicalValue());
// set javadoc
if( mem.javadoc!=null )
constRef.javadoc().append(mem.javadoc);
eo.constants.add(new EnumConstantOutline(mem,constRef){});
}
if(needsValue) {
// [RESULT]
// final <valueType> value;
JFieldVar $value = type.field( JMod.PRIVATE|JMod.FINAL, baseExposedType, "value" );
// [RESULT]
// public <valuetype> value() { return value; }
type.method(JMod.PUBLIC, baseExposedType, "value" ).body()._return($value);
// [RESULT]
// <constructor>(<valueType> v) {
// this.value=v;
// }
{
JMethod m = type.constructor(0);
m.body().assign( $value, m.param( baseImplType, "v" ) );
}
// [RESULT]
// public static <Const> fromValue(<valueType> v) {
// for( <Const> c : <Const>.values() ) {
// if(c.value == v) // or equals
// return c;
// }
// throw new IllegalArgumentException(...);
// }
{
JMethod m = type.method(JMod.PUBLIC|JMod.STATIC , type, "fromValue" );
JVar $v = m.param(baseExposedType,"v");
JForEach fe = m.body().forEach(type,"c", type.staticInvoke("values") );
JExpression eq;
if(baseExposedType.isPrimitive())
eq = fe.var().ref($value).eq($v);
else
eq = fe.var().ref($value).invoke("equals").arg($v);
fe.body()._if(eq)._then()._return(fe.var());
JInvocation ex = JExpr._new(codeModel.ref(IllegalArgumentException.class));
JExpression strForm;
if(baseExposedType.isPrimitive()) {
strForm = codeModel.ref(String.class).staticInvoke("valueOf").arg($v);
} else
if(baseExposedType==codeModel.ref(String.class)){
strForm = $v;
} else {
strForm = $v.invoke("toString");
}
m.body()._throw(ex.arg(strForm));