CodeExpression GenerateObjectInstance (object value, bool throwOnError)
{
if (value == null)
return new CodePrimitiveExpression (null);
if (value is System.Type) {
CodeTypeReference tref = new CodeTypeReference (value.ToString ());
return new CodeTypeOfExpression (tref);
}
Type t = value.GetType ();
if (t.IsPrimitive || value is string)
return new CodePrimitiveExpression (value);
if (t.IsArray) {
Array ar = (Array) value;
CodeExpression[] items = new CodeExpression [ar.Length];
for (int n=0; n<ar.Length; n++) {
CodeExpression exp = GenerateObjectInstance (ar.GetValue (n), throwOnError);
if (exp == null) return null;
items [n] = exp;
}
return new CodeArrayCreateExpression (new CodeTypeReference (t), items);
}
TypeConverter converter = TypeDescriptor.GetConverter (t);
if (converter != null && converter.CanConvertTo (typeof (InstanceDescriptor))) {
InstanceDescriptor idesc = (InstanceDescriptor) converter.ConvertTo (value, typeof(InstanceDescriptor));
return GenerateInstance (idesc, throwOnError);
}
InstanceDescriptor desc = GetDefaultInstanceDescriptor (value);
if (desc != null) return GenerateInstance (desc, throwOnError);
if (throwOnError)
throw new ParseException (currentLocation, "Cannot generate an instance for the type: " + t);
else
return null;
}