* MapCodeGenerator.cs, SoapCodeExporter.cs: Generate the same XmlInclude
[mono.git] / mcs / class / System.XML / System.Xml.Serialization / SoapCodeExporter.cs
1 // \r
2 // System.Xml.Serialization.SoapCodeExporter \r
3 //\r
4 // Author:\r
5 //   Tim Coleman (tim@timcoleman.com)\r
6 //   Lluis Sanchez Gual (lluis@ximian.com)\r
7 //\r
8 // Copyright (C) Tim Coleman, 2002\r
9 //\r
10 \r
11 using System.CodeDom;\r
12 \r
13 namespace System.Xml.Serialization {\r
14         public class SoapCodeExporter {\r
15 \r
16                 #region Fields\r
17 \r
18                 CodeNamespace codeNamespace;\r
19                 CodeCompileUnit codeCompileUnit;\r
20                 SoapMapCodeGenerator codeGenerator;\r
21 \r
22                 #endregion\r
23 \r
24                 #region Constructors\r
25 \r
26                 public SoapCodeExporter (CodeNamespace codeNamespace): this (codeNamespace, null)\r
27                 {\r
28                 }\r
29 \r
30                 public SoapCodeExporter (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit)\r
31                 {\r
32                         this.codeCompileUnit = codeCompileUnit;\r
33                         this.codeNamespace = codeNamespace;\r
34                         \r
35                         codeGenerator = new SoapMapCodeGenerator (codeNamespace, codeCompileUnit);\r
36                 }\r
37 \r
38                 #endregion // Constructors\r
39 \r
40                 #region Properties\r
41 \r
42                 public CodeAttributeDeclarationCollection IncludeMetadata {\r
43                         get { return codeGenerator.IncludeMetadata; }\r
44                 }\r
45                 \r
46                 #endregion // Properties\r
47 \r
48                 #region Methods\r
49 \r
50                 public void AddMappingMetadata (CodeAttributeDeclarationCollection metadata, XmlMemberMapping member)\r
51                 {\r
52                         AddMappingMetadata (metadata, member, false);\r
53                 }\r
54 \r
55                 public void AddMappingMetadata (CodeAttributeDeclarationCollection metadata, XmlMemberMapping member, bool forceUseMemberName)\r
56                 {\r
57                         TypeData memType = member.TypeMapMember.TypeData;\r
58                         \r
59                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapElement");\r
60                         if (forceUseMemberName || (member.ElementName != member.MemberName))\r
61                                 att.Arguments.Add (new CodeAttributeArgument (new CodePrimitiveExpression(member.ElementName)));\r
62                         if (!TypeTranslator.IsDefaultPrimitiveTpeData (memType))\r
63                                 att.Arguments.Add (new CodeAttributeArgument ("DataType", new CodePrimitiveExpression(member.TypeName)));\r
64                                 \r
65                         if (att.Arguments.Count > 0) \r
66                                 metadata.Add (att);\r
67                 }\r
68 \r
69                 public void ExportMembersMapping (XmlMembersMapping xmlMembersMapping)\r
70                 {\r
71                         codeGenerator.ExportMembersMapping (xmlMembersMapping);\r
72                 }\r
73 \r
74                 public void ExportTypeMapping (XmlTypeMapping xmlTypeMapping)\r
75                 {\r
76                         codeGenerator.ExportTypeMapping (xmlTypeMapping);\r
77                 }\r
78 \r
79 \r
80                 #endregion // Methods\r
81         }\r
82 \r
83         class SoapMapCodeGenerator : MapCodeGenerator\r
84         {\r
85                 public SoapMapCodeGenerator (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit)\r
86                 : base (codeNamespace, codeCompileUnit)\r
87                 {\r
88                         includeArrayTypes = true;\r
89                 }\r
90 \r
91                 protected override void GenerateClass (XmlTypeMapping map, CodeTypeDeclaration codeClass)\r
92                 {\r
93                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapType");\r
94                         if (map.XmlType != map.TypeData.TypeName) att.Arguments.Add (GetArg (map.XmlType));\r
95                         if (map.XmlTypeNamespace != "") att.Arguments.Add (GetArg ("Namespace", map.XmlTypeNamespace));\r
96                         AddCustomAttribute (codeClass, att, false);\r
97                 }\r
98                 \r
99                 protected override void GenerateClassInclude (CodeAttributeDeclarationCollection attributes, XmlTypeMapping map)\r
100                 {\r
101                         CodeAttributeDeclaration iatt = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapInclude");\r
102                         iatt.Arguments.Add (new CodeAttributeArgument (new CodeTypeOfExpression(map.TypeData.FullTypeName)));\r
103                         attributes.Add (iatt);\r
104                 }\r
105         \r
106                 protected override void GenerateAttributeMember (CodeAttributeDeclarationCollection attributes, XmlTypeMapMemberAttribute attinfo, string defaultNamespace, bool forceUseMemberName)\r
107                 {\r
108                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapAttribute");\r
109                         if (attinfo.Name != attinfo.AttributeName) att.Arguments.Add (GetArg (attinfo.AttributeName));\r
110                         if (attinfo.Namespace != defaultNamespace) att.Arguments.Add (GetArg ("Namespace", attinfo.Namespace));\r
111                         if (!TypeTranslator.IsDefaultPrimitiveTpeData(attinfo.TypeData)) att.Arguments.Add (GetArg ("DataType",attinfo.TypeData.XmlType));\r
112                         attributes.Add (att);\r
113                 }\r
114                 \r
115                 protected override void GenerateElementInfoMember (CodeAttributeDeclarationCollection attributes, XmlTypeMapMemberElement member, XmlTypeMapElementInfo einfo, TypeData defaultType, string defaultNamespace, bool addAlwaysAttr, bool forceUseMemberName)\r
116                 {\r
117                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapElement");\r
118                         if (forceUseMemberName || einfo.ElementName != member.Name) att.Arguments.Add (GetArg (einfo.ElementName));\r
119 //                      if (einfo.IsNullable) att.Arguments.Add (GetArg ("IsNullable", true));  MS seems to ignore this\r
120                         if (!TypeTranslator.IsDefaultPrimitiveTpeData(einfo.TypeData)) att.Arguments.Add (GetArg ("DataType",einfo.TypeData.XmlType));\r
121                         if (addAlwaysAttr || att.Arguments.Count > 0) attributes.Add (att);\r
122                 }\r
123                 \r
124                 protected override void GenerateEnum (XmlTypeMapping map, CodeTypeDeclaration codeEnum)\r
125                 {\r
126                         CodeAttributeDeclaration att = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapType");\r
127                         if (map.XmlType != map.TypeData.TypeName) att.Arguments.Add (GetArg (map.XmlType));\r
128                         if (map.XmlTypeNamespace != "") att.Arguments.Add (GetArg ("Namespace", map.XmlTypeNamespace));\r
129                         AddCustomAttribute (codeEnum, att, false);\r
130                 }               \r
131                 \r
132                 protected override void GenerateEnumItem (CodeMemberField codeField, EnumMap.EnumMapMember emem)\r
133                 {\r
134                         if (emem.EnumName != emem.XmlName)\r
135                         {\r
136                                 CodeAttributeDeclaration xatt = new CodeAttributeDeclaration ("System.Xml.Serialization.SoapEnum");\r
137                                 xatt.Arguments.Add (GetArg ("Name", emem.XmlName));\r
138                                 AddCustomAttribute (codeField, xatt, true);\r
139                         }\r
140                 }               \r
141                 \r
142                 protected override void GenerateSpecifierMember (CodeMemberField codeField)\r
143                 {\r
144                         AddCustomAttribute (codeField, "System.Xml.Serialization.SoapIgnore");\r
145                 }\r
146         }\r
147 }