Author: mhabersack
Date: 2007-09-27 07:24:44 -0400 (Thu, 27 Sep 2007)
New Revision: 86481
Modified:
trunk/mcs/class/System.Web/System.Web.Compilation/ChangeLog
trunk/mcs/class/System.Web/System.Web.Compilation/TemplateControlCompiler.cs
Log:
2007-09-27 Marek Habersack <[EMAIL PROTECTED]>
* TemplateControlCompiler.cs: support nullable types in
GenerateExpressionFromString.
Modified: trunk/mcs/class/System.Web/System.Web.Compilation/ChangeLog
===================================================================
--- trunk/mcs/class/System.Web/System.Web.Compilation/ChangeLog 2007-09-27
11:01:35 UTC (rev 86480)
+++ trunk/mcs/class/System.Web/System.Web.Compilation/ChangeLog 2007-09-27
11:24:44 UTC (rev 86481)
@@ -1,3 +1,8 @@
+2007-09-27 Marek Habersack <[EMAIL PROTECTED]>
+
+ * TemplateControlCompiler.cs: support nullable types in
+ GenerateExpressionFromString.
+
2007-09-21 Marek Habersack <[EMAIL PROTECTED]>
* TemplateControlCompiler.cs: if we're running on a platform with
Modified:
trunk/mcs/class/System.Web/System.Web.Compilation/TemplateControlCompiler.cs
===================================================================
---
trunk/mcs/class/System.Web/System.Web.Compilation/TemplateControlCompiler.cs
2007-09-27 11:01:35 UTC (rev 86480)
+++
trunk/mcs/class/System.Web/System.Web.Compilation/TemplateControlCompiler.cs
2007-09-27 11:24:44 UTC (rev 86481)
@@ -1604,6 +1604,21 @@
return (TypeConverter) Activator.CreateInstance (t);
}
+ CodeExpression CreateNullableExpression (Type type,
CodeExpression inst, bool nullable)
+ {
+#if NET_2_0
+ if (!nullable)
+ return inst;
+
+ return new CodeObjectCreateExpression (
+ type,
+ new CodeExpression[] {inst}
+ );
+#else
+ return inst;
+#endif
+ }
+
CodeExpression GetExpressionFromString (Type type, string str,
MemberInfo member)
{
TypeConverter cvt = GetConverterForMember (member);
@@ -1619,12 +1634,13 @@
preConverted = true;
}
}
-
+
+ bool wasNullable = false;
+ Type originalType = type;
#if NET_2_0
- bool wasNullable = false;
-
if (type.IsGenericType &&
type.GetGenericTypeDefinition() == typeof(Nullable<>)) {
Type[] types = type.GetGenericArguments();
+ originalType = type;
type = types[0]; // we're interested only in
the first type here
wasNullable = true;
}
@@ -1632,24 +1648,28 @@
if (type == typeof (string)) {
if (preConverted)
- return new CodePrimitiveExpression
((string) convertedFromAttr);
+ return CreateNullableExpression
(originalType,
+ new
CodePrimitiveExpression ((string) convertedFromAttr),
+
wasNullable);
#if NET_2_0
object[] urlAttr = member.GetCustomAttributes
(typeof (UrlPropertyAttribute), true);
if (urlAttr.Length != 0)
str = HandleUrlProperty (str, member);
#endif
- return new CodePrimitiveExpression (str);
+ return CreateNullableExpression (originalType,
new CodePrimitiveExpression (str), wasNullable);
}
if (type == typeof (bool)) {
if (preConverted)
- return new CodePrimitiveExpression
((bool) convertedFromAttr);
+ return CreateNullableExpression
(originalType,
+ new
CodePrimitiveExpression ((bool) convertedFromAttr),
+
wasNullable);
if (str == null || str == "" ||
InvariantCompareNoCase (str, "true"))
- return new CodePrimitiveExpression
(true);
+ return CreateNullableExpression
(originalType, new CodePrimitiveExpression (true), wasNullable);
else if (InvariantCompareNoCase (str, "false"))
- return new CodePrimitiveExpression
(false);
+ return CreateNullableExpression
(originalType, new CodePrimitiveExpression (false), wasNullable);
#if NET_2_0
else if (wasNullable &&
InvariantCompareNoCase(str, "null"))
return new CodePrimitiveExpression
(null);
@@ -1663,9 +1683,11 @@
return new CodePrimitiveExpression (null);
if (type.IsPrimitive)
- return new CodePrimitiveExpression (
- Convert.ChangeType (preConverted ?
convertedFromAttr : str,
- type,
CultureInfo.InvariantCulture));
+ return CreateNullableExpression (originalType,
+ new
CodePrimitiveExpression (
+
Convert.ChangeType (preConverted ? convertedFromAttr : str,
+
type, CultureInfo.InvariantCulture)),
+ wasNullable);
if (type == typeof (string [])) {
string [] subs;
@@ -1679,7 +1701,7 @@
foreach (string v in subs)
expr.Initializers.Add (new
CodePrimitiveExpression (v.Trim ()));
- return expr;
+ return CreateNullableExpression (originalType,
expr, wasNullable);
}
if (type == typeof (Color)) {
@@ -1691,7 +1713,9 @@
if (str.Trim().Length == 0) {
CodeTypeReferenceExpression ft
= new CodeTypeReferenceExpression (typeof (Color));
- return new
CodeFieldReferenceExpression (ft, "Empty");
+ return CreateNullableExpression
(originalType,
+
new CodeFieldReferenceExpression (ft, "Empty"),
+
wasNullable);
}
try {
@@ -1733,7 +1757,7 @@
expr.TargetObject = new
CodeTypeReferenceExpression (type);
expr.FieldName = c.Name;
- return expr;
+ return CreateNullableExpression
(originalType, expr, wasNullable);
} else {
CodeMethodReferenceExpression m = new
CodeMethodReferenceExpression ();
m.TargetObject = new
CodeTypeReferenceExpression (type);
@@ -1743,24 +1767,29 @@
invoke.Parameters.Add (new
CodePrimitiveExpression (c.R));
invoke.Parameters.Add (new
CodePrimitiveExpression (c.G));
invoke.Parameters.Add (new
CodePrimitiveExpression (c.B));
- return invoke;
+ return CreateNullableExpression
(originalType, invoke, wasNullable);
}
}
TypeConverter converter = preConverted ? cvt :
+ wasNullable ? TypeDescriptor.GetConverter
(type) :
TypeDescriptor.GetProperties
(member.DeclaringType) [member.Name].Converter;
-
+
if (preConverted || (converter != null &&
converter.CanConvertFrom (typeof (string)))) {
object value = preConverted ? convertedFromAttr
: converter.ConvertFromInvariantString (str);
if (converter.CanConvertTo (typeof
(InstanceDescriptor))) {
InstanceDescriptor idesc =
(InstanceDescriptor) converter.ConvertTo (value, typeof(InstanceDescriptor));
+ if (wasNullable)
+ return CreateNullableExpression
(originalType, GenerateInstance (idesc, true),
+
wasNullable);
+
return new CodeCastExpression (type,
GenerateInstance (idesc, true));
}
CodeExpression exp = GenerateObjectInstance
(value, false);
if (exp != null)
- return exp;
+ return CreateNullableExpression
(originalType, exp, wasNullable);
CodeMethodReferenceExpression m = new
CodeMethodReferenceExpression ();
m.TargetObject = new
CodeTypeReferenceExpression (typeof (TypeDescriptor));
@@ -1772,12 +1801,15 @@
invoke = new CodeMethodInvokeExpression
(invoke, "ConvertFrom");
invoke.Parameters.Add (new
CodePrimitiveExpression (str));
- return new CodeCastExpression (tref, invoke);
+ if (wasNullable)
+ return CreateNullableExpression
(originalType, invoke, wasNullable);
+
+ return new CodeCastExpression (type, invoke);
}
Console.WriteLine ("Unknown type: " + type + " value: "
+ str);
- return new CodePrimitiveExpression (str);
+ return CreateNullableExpression (originalType, new
CodePrimitiveExpression (str), wasNullable);
}
CodeExpression GenerateInstance (InstanceDescriptor idesc, bool
throwOnError)
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches