X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem.XML%2FSystem.Xml.Serialization%2FMapCodeGenerator.cs;h=1887ab24723f765700b0594cbb1fe3f8c8ad10b6;hb=20d845ca07479ece43da9e344c060e49887fd369;hp=45d14ee278cc7c1e3dd8c87c1cec15c21922775a;hpb=f99ce750ee781a2584e849a0264300fa4d99aaaa;p=mono.git diff --git a/mcs/class/System.XML/System.Xml.Serialization/MapCodeGenerator.cs b/mcs/class/System.XML/System.Xml.Serialization/MapCodeGenerator.cs index 45d14ee278c..1887ab24723 100644 --- a/mcs/class/System.XML/System.Xml.Serialization/MapCodeGenerator.cs +++ b/mcs/class/System.XML/System.Xml.Serialization/MapCodeGenerator.cs @@ -31,10 +31,8 @@ using System.CodeDom; using System.CodeDom.Compiler; using System.Collections; -#if NET_2_0 using System.ComponentModel; using System.Diagnostics; -#endif using System.Globalization; using System.Xml.Schema; @@ -44,29 +42,32 @@ namespace System.Xml.Serialization { internal class MapCodeGenerator { CodeNamespace codeNamespace; - CodeCompileUnit codeCompileUnit; +// CodeCompileUnit codeCompileUnit; CodeAttributeDeclarationCollection includeMetadata; - XmlTypeMapping exportedAnyType = null; + XmlTypeMapping exportedAnyType; protected bool includeArrayTypes; CodeDomProvider codeProvider; CodeGenerationOptions options; + CodeIdentifiers identifiers; Hashtable exportedMaps = new Hashtable (); Hashtable includeMaps = new Hashtable (); public MapCodeGenerator (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit, CodeGenerationOptions options) { - this.codeCompileUnit = codeCompileUnit; +// this.codeCompileUnit = codeCompileUnit; this.codeNamespace = codeNamespace; this.options = options; + this.identifiers = new CodeIdentifiers (); } public MapCodeGenerator (CodeNamespace codeNamespace, CodeCompileUnit codeCompileUnit, CodeDomProvider codeProvider, CodeGenerationOptions options, Hashtable mappings) { - this.codeCompileUnit = codeCompileUnit; +// this.codeCompileUnit = codeCompileUnit; this.codeNamespace = codeNamespace; - this.codeProvider = codeProvider; this.options = options; + this.codeProvider = codeProvider; + this.identifiers = new CodeIdentifiers ((codeProvider.LanguageOptions & LanguageOptions.CaseInsensitive) == 0); // this.mappings = mappings; } @@ -130,9 +131,7 @@ namespace System.Xml.Serialization { if (codeClass != null) { // Regenerate attributes, since things may have changed codeClass.CustomAttributes.Clear (); -#if NET_2_0 AddClassAttributes (codeClass); -#endif GenerateClass (map, codeClass, isTopLevel); ExportDerivedTypeAttributes (map, codeClass); } @@ -157,10 +156,8 @@ namespace System.Xml.Serialization { AddCodeType (codeClass, map.Documentation); codeClass.Attributes = MemberAttributes.Public; -#if NET_2_0 codeClass.IsPartial = CodeProvider.Supports(GeneratorSupport.PartialTypes); AddClassAttributes (codeClass); -#endif GenerateClass (map, codeClass, isTopLevel); ExportDerivedTypeAttributes (map, codeClass); @@ -169,7 +166,7 @@ namespace System.Xml.Serialization { if (map.BaseMap != null && map.BaseMap.TypeData.SchemaType != SchemaTypes.XmlNode) { - CodeTypeReference ctr = new CodeTypeReference (map.BaseMap.TypeData.FullTypeName); + CodeTypeReference ctr = GetDomType (map.BaseMap.TypeData, false); codeClass.BaseTypes.Add (ctr); if (map.BaseMap.IncludeInSchema) { ExportMapCode (map.BaseMap, false); @@ -202,9 +199,19 @@ namespace System.Xml.Serialization { void ExportMembersMapCode (CodeTypeDeclaration codeClass, ClassMap map, string defaultNamespace, XmlTypeMapping baseMap) { + ICollection attributes = map.AttributeMembers; + ICollection members = map.ElementMembers; + + // collect names + if (attributes != null) + foreach (XmlTypeMapMemberAttribute attr in attributes) + identifiers.AddUnique (attr.Name, attr); + if (members != null) + foreach (XmlTypeMapMemberElement member in members) + identifiers.AddUnique (member.Name, member); + // Write attributes - ICollection attributes = map.AttributeMembers; if (attributes != null) { foreach (XmlTypeMapMemberAttribute attr in attributes) { if (baseMap != null && DefinedInBaseMap (baseMap, attr)) continue; @@ -212,7 +219,7 @@ namespace System.Xml.Serialization { } } - ICollection members = map.ElementMembers; + members = map.ElementMembers; if (members != null) { @@ -261,12 +268,12 @@ namespace System.Xml.Serialization { CodeTypeMember CreateFieldMember (CodeTypeDeclaration codeClass, TypeData type, string name) { - return CreateFieldMember (codeClass, GetDomType (type), name, System.DBNull.Value, null, null); + return CreateFieldMember (codeClass, GetDomType (type, false), name, System.DBNull.Value, null, null); } CodeTypeMember CreateFieldMember (CodeTypeDeclaration codeClass, XmlTypeMapMember member) { - return CreateFieldMember (codeClass, GetDomType (member.TypeData), member.Name, member.DefaultValue, member.TypeData, member.Documentation); + return CreateFieldMember (codeClass, GetDomType (member.TypeData, member.RequiresNullable), member.Name, member.DefaultValue, member.TypeData, member.Documentation); } CodeTypeMember CreateFieldMember (CodeTypeDeclaration codeClass, CodeTypeReference type, string name, object defaultValue, TypeData defaultType, string documentation) @@ -275,7 +282,7 @@ namespace System.Xml.Serialization { CodeTypeMember codeProp = null; if ((options & CodeGenerationOptions.GenerateProperties) > 0) { - string field = CodeIdentifier.MakeCamel (name + "Field"); + string field = identifiers.AddUnique (CodeIdentifier.MakeCamel (name + "Field"), name); codeField = new CodeMemberField (type, field); codeField.Attributes = MemberAttributes.Private; codeClass.Members.Add (codeField); @@ -322,7 +329,7 @@ namespace System.Xml.Serialization { if (attinfo.TypeData.IsValueType && attinfo.IsOptionalValueType) { - codeField = CreateFieldMember (codeClass, typeof(bool), attinfo.Name + "Specified"); + codeField = CreateFieldMember (codeClass, typeof(bool), identifiers.MakeUnique (attinfo.Name + "Specified")); codeField.Attributes = MemberAttributes.Public; GenerateSpecifierMember (codeField); } @@ -345,7 +352,7 @@ namespace System.Xml.Serialization { if (member.TypeData.IsValueType && member.IsOptionalValueType) { - codeField = CreateFieldMember (codeClass, typeof(bool), member.Name + "Specified"); + codeField = CreateFieldMember (codeClass, typeof(bool), identifiers.MakeUnique (member.Name + "Specified")); codeField.Attributes = MemberAttributes.Public; GenerateSpecifierMember (codeField); } @@ -364,14 +371,15 @@ namespace System.Xml.Serialization { foreach (XmlTypeMapElementInfo einfo in member.ElementInfo) { - if (ExportExtraElementAttributes (attributes, einfo, defaultNamespace, defaultType)) - continue; - - GenerateElementInfoMember (attributes, member, einfo, defaultType, defaultNamespace, addAlwaysAttr, forceUseMemberName); if (einfo.MappedType != null) { ExportMapCode (einfo.MappedType, false); RemoveInclude (einfo.MappedType); } + + if (ExportExtraElementAttributes (attributes, einfo, defaultNamespace, defaultType)) + continue; + + GenerateElementInfoMember (attributes, member, einfo, defaultType, defaultNamespace, addAlwaysAttr, forceUseMemberName | addAlwaysAttr); } GenerateElementMember (attributes, member); @@ -480,7 +488,6 @@ namespace System.Xml.Serialization { if (emap.IsFlags) codeEnum.CustomAttributes.Add (new CodeAttributeDeclaration ("System.FlagsAttribute")); -#if NET_2_0 CodeAttributeDeclaration generatedCodeAttribute = new CodeAttributeDeclaration ( new CodeTypeReference (typeof(GeneratedCodeAttribute))); generatedCodeAttribute.Arguments.Add (new CodeAttributeArgument ( @@ -491,7 +498,6 @@ namespace System.Xml.Serialization { codeEnum.CustomAttributes.Add (new CodeAttributeDeclaration ( new CodeTypeReference (typeof (SerializableAttribute)))); -#endif GenerateEnum (map, codeEnum, isTopLevel); @@ -588,7 +594,6 @@ namespace System.Xml.Serialization { codeNamespace.Types.Add (type); } -#if NET_2_0 void AddClassAttributes (CodeTypeDeclaration codeClass) { CodeAttributeDeclaration generatedCodeAttribute = new CodeAttributeDeclaration ( @@ -610,12 +615,13 @@ namespace System.Xml.Serialization { new CodePrimitiveExpression ("code"))); codeClass.CustomAttributes.Add (designerCategoryAttribute); } -#endif - CodeTypeReference GetDomType (TypeData data) + CodeTypeReference GetDomType (TypeData data, bool requiresNullable) { + if (data.IsValueType && (data.IsNullable || requiresNullable)) + return new CodeTypeReference ("System.Nullable", new CodeTypeReference (data.FullTypeName)); if (data.SchemaType == SchemaTypes.Array) - return new CodeTypeReference (GetDomType (data.ListItemTypeData),1); + return new CodeTypeReference (GetDomType (data.ListItemTypeData, false),1); else return new CodeTypeReference (data.FullTypeName); } @@ -624,7 +630,6 @@ namespace System.Xml.Serialization { #region Private Properties -#if NET_2_0 private CodeDomProvider CodeProvider { get { if (codeProvider == null) { @@ -633,7 +638,6 @@ namespace System.Xml.Serialization { return codeProvider; } } -#endif #endregion @@ -660,15 +664,16 @@ namespace System.Xml.Serialization { throw new InvalidOperationException ("Type " + typeData.TypeName + " not supported"); IFormattable defaultValueFormattable = defaultValue as IFormattable; - CodeFieldReferenceExpression fref = new CodeFieldReferenceExpression (new CodeTypeReferenceExpression (typeData.FullTypeName), defaultValueFormattable != null ? defaultValueFormattable.ToString(null, CultureInfo.InvariantCulture) : defaultValue.ToString ()); + CodeFieldReferenceExpression fref = new CodeFieldReferenceExpression (new CodeTypeReferenceExpression (GetDomType (typeData, false)), defaultValueFormattable != null ? defaultValueFormattable.ToString(null, CultureInfo.InvariantCulture) : defaultValue.ToString ()); CodeAttributeArgument arg = new CodeAttributeArgument (fref); AddCustomAttribute (externalField, "System.ComponentModel.DefaultValue", arg); - internalField.InitExpression = fref; + //internalField.InitExpression = fref; } else { + defaultValue = defaultValue is decimal ? (object) ('"' + ((decimal) defaultValue).ToString (CultureInfo.InvariantCulture) + '"') : defaultValue; AddCustomAttribute (externalField, "System.ComponentModel.DefaultValue", GetArg (defaultValue)); - internalField.InitExpression = new CodePrimitiveExpression (defaultValue); + //internalField.InitExpression = new CodePrimitiveExpression (defaultValue); } }