object ResolveConstInitializer(ref CiType type, object value)
{
if (type is CiArrayType) {
object[] array = value as object[];
if (array == null)
return value;
CiType elementType = ((CiArrayType) type).ElementType;
if (type is CiArrayStorageType) {
int expected = ((CiArrayStorageType) type).Length;
if (array.Length != expected)
throw new ResolveException("Expected {0} array elements, got {1}", expected, array.Length);
}
else {
type = new CiArrayStorageType { ElementType = elementType, Length = array.Length };
}
Array dest = Array.CreateInstance(elementType.DotNetType, array.Length);
for (int i = 0; i < array.Length; i++)
dest.SetValue(ResolveConstInitializer(ref elementType, array[i]), i);
return dest;
}
if (value is CiExpr)
return ResolveConstExpr((CiExpr) value, type);
return value;
}