diff options
Diffstat (limited to 'mcs/class/PresentationFramework/Mono.Windows.Serialization/CodeWriter.cs')
-rw-r--r-- | mcs/class/PresentationFramework/Mono.Windows.Serialization/CodeWriter.cs | 67 |
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() { |