private String defaultDiscriminator (UnionEntry u)
{
Vector labels = vectorizeLabels (u.branches (), false );
String ret = null;
SymtabEntry utype = Util.typeOf (u.type ());
if (utype instanceof PrimitiveEntry && utype.name ().equals ("boolean")) {
// If it got this far, then:
// - there is only one branch;
// - that branch has only one label.
if (labels.contains ("true"))
ret = "false";
else
ret = "true";
} else if (utype.name ().equals ("char")) {
// This doesn't handle '\u0030' == '0'. Unions are so
// seldom used. I don't have time to make this perfect.
int def = 0;
String string = "'\\u0000'";
while (def != 0xFFFF && labels.contains (string))
if (++def / 0x10 == 0)
string = "'\\u000" + def + "'";
else if (def / 0x100 == 0)
string = "\\u00" + def + "'";
else if (def / 0x1000 == 0)
string = "\\u0" + def + "'";
else
string = "\\u" + def + "'";
ret = string;
} else if (utype instanceof EnumEntry) {
Enumeration e = labels.elements ();
EnumEntry enumEntry = (EnumEntry)utype;
Vector enumList = (Vector)enumEntry.elements ().clone ();
// cull out those elements in the enumeration list that are
// in the cases of this union
while (e.hasMoreElements ())
enumList.removeElement (e.nextElement ());
// If all of the enum elements are covered in this union and
// there is a default statement, just pick one of the
// elements for the default. If there are enum elements
// which are NOT covered by the cases, pick one as the
// default.
if (enumList.size () == 0)
ret = typePackage + (String)enumEntry.elements ().lastElement ();
else
ret = typePackage + (String)enumList.firstElement ();
} else if (utype.name ().equals ("octet")) {
short def = Byte.MIN_VALUE;
while (def != Byte.MAX_VALUE && labels.contains (Integer.toString (def)))
++def;
ret = Integer.toString (def);
} else if (utype.name ().equals ("short")) {
short def = Short.MIN_VALUE;
while (def != Short.MAX_VALUE && labels.contains (Integer.toString (def)))
++def;
ret = Integer.toString (def);
} else if (utype.name ().equals ("long")) {
int def = Integer.MIN_VALUE;
while (def != Integer.MAX_VALUE && labels.contains (Integer.toString (def)))
++def;
ret = Integer.toString (def);
} else if (utype.name ().equals ("long long")) {
long def = Long.MIN_VALUE;
while (def != Long.MAX_VALUE && labels.contains (Long.toString (def)))
++def;
ret = Long.toString (def);
} else if (utype.name ().equals ("unsigned short")) {
short def = 0;
while (def != Short.MAX_VALUE && labels.contains (Integer.toString (def)))
++def;
ret = Integer.toString (def);
} else if (utype.name ().equals ("unsigned long")) {
int def = 0;
while (def != Integer.MAX_VALUE && labels.contains (Integer.toString (def)))
++def;
ret = Integer.toString (def);
} else if (utype.name ().equals ("unsigned long long")) {
long def = 0;
while (def != Long.MAX_VALUE && labels.contains (Long.toString (def)))
++def;
ret = Long.toString (def);
}