Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/class/PresentationFramework/Mono.Windows.Serialization/CodeWriter.cs')
-rw-r--r--mcs/class/PresentationFramework/Mono.Windows.Serialization/CodeWriter.cs67
1 files changed, 67 insertions, 0 deletions
diff --git a/mcs/class/PresentationFramework/Mono.Windows.Serialization/CodeWriter.cs b/mcs/class/PresentationFramework/Mono.Windows.Serialization/CodeWriter.cs
index 5a39087f192..204e2cc94fe 100644
--- a/mcs/class/PresentationFramework/Mono.Windows.Serialization/CodeWriter.cs
+++ b/mcs/class/PresentationFramework/Mono.Windows.Serialization/CodeWriter.cs
@@ -234,6 +234,7 @@ namespace Mono.Windows.Serialization {
"GetConverter"),
new CodeTypeOfExpression(propertyType));
}
+
// top of stack is reference to a property
public void CreatePropertyText(string text, Type propertyType)
{
@@ -257,6 +258,72 @@ namespace Mono.Windows.Serialization {
constructor.Statements.Add(assignment);
}
+
+ public void CreatePropertyObject(Type type, string varName)
+ {
+ bool isDefaultName;
+ if (varName == null) {
+ isDefaultName = true;
+ varName = Char.ToLower(type.Name[0]) + type.Name.Substring(1);
+ // make sure something sensible happens when class
+ // names start with a lowercase letter
+ if (varName == type.Name)
+ varName = "_" + varName;
+ } else {
+ isDefaultName = false;
+ }
+
+ if (!nameClashes.ContainsKey(varName))
+ nameClashes[varName] = 0;
+ else {
+ nameClashes[varName] = 1 + (int)nameClashes[varName];
+ varName += (int)nameClashes[varName];
+ }
+
+
+ if (isDefaultName) {
+ CodeVariableDeclarationStatement declaration =
+ new CodeVariableDeclarationStatement(type,
+ varName,
+ new CodeObjectCreateExpression(type));
+ constructor.Statements.Add(declaration);
+ } else {
+ CodeMemberField declaration = new CodeMemberField(type, varName);
+ declaration.InitExpression = new CodeObjectCreateExpression(type);
+ this.type.Members.Add(declaration);
+ }
+ CodeVariableReferenceExpression varRef = new CodeVariableReferenceExpression(varName);
+
+ objects.Add(type);
+ objects.Add(varRef);
+
+ }
+
+ public void EndPropertyObject(Type sourceType)
+ {
+ CodeExpression varRef = (CodeExpression)objects[objects.Count - 1];
+ objects.RemoveAt(objects.Count - 1);
+ Type destType = (Type)objects[objects.Count - 1];
+ objects.RemoveAt(objects.Count - 1);
+
+
+ CodeExpression expr;
+ if (destType == sourceType)
+ expr = varRef;
+ else
+ expr = new CodeCastExpression(
+ new CodeTypeReference(destType),
+ new CodeMethodInvokeExpression(
+ fetchConverter(sourceType),
+ "ConvertTo",
+ varRef,
+ new CodeTypeOfExpression(destType)));
+ CodeAssignStatement assignment = new CodeAssignStatement(
+ (CodeExpression)objects[objects.Count - 1],
+ expr);
+ constructor.Statements.Add(assignment);
+
+ }
public void EndObject()
{