in flex/tools/idea-fdb-fix/idea_fdb_4.0.0.14159_fix/src/flex/tools/debugger/cli/ExpressionCache.java [297:473]
public static void appendVariableValue(StringBuilder sb, Value val, String variableName)
{
int type = val.getType();
String typeName = val.getTypeName();
String className = val.getClassName();
// if no string or empty then typeName is blank
if (typeName != null && typeName.length() == 0)
typeName = null;
switch (type)
{
case VariableType.NUMBER:
{
double value = ((Number)val.getValueAsObject()).doubleValue();
long longValue = (long) value;
// The value is stored as a double; however, in practice most values are
// actually integers. Check to see if this is the case, and if it is,
// then display it:
// - without a fraction, and
// - with its hex equivalent in parentheses.
// Note, we use 'long' instead of 'int', in order to deal with the
// ActionScript type 'uint'.
if (longValue == value)
{
sb.append(longValue);
sb.append(" (0x"); //$NON-NLS-1$
sb.append(Long.toHexString(longValue));
sb.append(")"); //$NON-NLS-1$
}
else
{
sb.append(value);
}
break;
}
case VariableType.BOOLEAN:
{
Boolean b = (Boolean)val.getValueAsObject();
if (b.booleanValue())
sb.append("true"); //$NON-NLS-1$
else
sb.append("false"); //$NON-NLS-1$
break;
}
case VariableType.STRING:
{
// Exceptions are displayed in angle brackets, e.g.
// foo = <Text of exception here>
// Strings are displayed quoted:
// foo = "Value of string here"
//
// Note that quotation marks within the string are not escaped. This
// is sort of weird, but it's what we want to do, at least for now;
// the debugger's output is intended to be human-readable, not
// machine-readable, and it's easier for a person to read the string
// if there is no escaping of quotation marks.
//
// As a small step in the direction of avoiding that weirdness, if
// the string contains double-quotes but no single-quotes, we will
// quote it in single quotes.
String s = val.getValueAsString();
char start, end;
if (val.isAttributeSet(ValueAttribute.IS_EXCEPTION))
{
start = '<';
end = '>';
}
else if (s.indexOf('"') != -1 && s.indexOf('\'') == -1)
{
start = end = '\'';
}
else
{
start = end = '"';
}
sb.append(start);
sb.append(StringUtil.escape(s));
sb.append(end);
break;
}
case VariableType.OBJECT:
{
sb.append("["); //$NON-NLS-1$
sb.append(className);
// Normally, we include the object id after the class name.
// However, when running fdbunit, don't show object IDs, so that
// results can reproduce consistently from one run to the next.
if (System.getProperty("fdbunit") == null) //$NON-NLS-1$
{
sb.append(" "); //$NON-NLS-1$
sb.append(StringUtil.escape(String.valueOf(val.getValueAsObject()))); // object id
}
if (typeName != null && !typeName.equals(className))
{
sb.append(", class='"); //$NON-NLS-1$
// Often the typename is of the form 'classname@hexaddress',
// but the hex address is the same as the object id which
// is returned by getValue() -- we don't want to display it
// here.
int at = typeName.indexOf('@');
if (at != -1)
typeName = typeName.substring(0, at);
sb.append(StringUtil.escape(typeName));
sb.append('\'');
}
sb.append(']');
break;
}
case VariableType.FUNCTION:
{
// here we have a special case for getters/setters which
// look like functions to us, except the attribute is set.
sb.append('[');
if (val.isAttributeSet(VariableAttribute.HAS_GETTER))
sb.append(getLocalizationManager().getLocalizedTextString("getterFunction")); //$NON-NLS-1$
else if (val.isAttributeSet(VariableAttribute.HAS_SETTER))
sb.append(getLocalizationManager().getLocalizedTextString("setterFunction")); //$NON-NLS-1$
else
sb.append(getLocalizationManager().getLocalizedTextString("function")); //$NON-NLS-1$
sb.append(' ');
sb.append(StringUtil.escape(String.valueOf(val.getValueAsObject())));
if (typeName != null && !typeName.equals(variableName))
{
sb.append(", name='"); //$NON-NLS-1$
sb.append(StringUtil.escape(typeName));
sb.append('\'');
}
sb.append(']');
break;
}
case VariableType.MOVIECLIP:
{
sb.append("["); //$NON-NLS-1$
sb.append(className);
sb.append(" "); //$NON-NLS-1$
sb.append(StringUtil.escape(String.valueOf(val.getValueAsObject())));
if (typeName != null && !typeName.equals(className))
{
sb.append(", named='"); //$NON-NLS-1$
sb.append(StringUtil.escape(typeName));
sb.append('\'');
}
sb.append(']');
break;
}
case VariableType.NULL:
{
sb.append("null"); //$NON-NLS-1$
break;
}
case VariableType.UNDEFINED:
{
sb.append("undefined"); //$NON-NLS-1$
break;
}
case VariableType.UNKNOWN:
{
sb.append(getLocalizationManager().getLocalizedTextString("unknownVariableType")); //$NON-NLS-1$
break;
}
}
}