Skip to content

Commit 9dabc90

Browse files
author
Michael Ganss
committed
Fix #94
1 parent cb116e1 commit 9dabc90

File tree

4 files changed

+52
-22
lines changed

4 files changed

+52
-22
lines changed

XmlSchemaClassGenerator.Tests/XmlTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ private void DeserializeSampleXml(string pattern, Assembly assembly)
214214
var invalid = false;
215215

216216
void validate(object s, ValidationEventArgs e)
217-
{
217+
{
218218
if (HandleValidationError(xml, e)) invalid = true;
219219
}
220220

XmlSchemaClassGenerator.Tests/xsd/simple/simple.xsd

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@
1616
<xs:element name="Root">
1717
<xs:complexType>
1818
<xs:sequence>
19+
<xs:element name="defaultDecimal" type="xs:decimal" default="+3." minOccurs="0" />
20+
<xs:element name="defaultDateTime" type="xs:dateTime" default="2004-04-12T13:20:00-05:00" />
21+
<xs:element name="defaultDate" type="xs:date" default="2004-04-12" />
22+
<xs:element name="defaultTime" type="xs:time" default="09:30:10Z" />
23+
1924
<xs:element name="anyURIElement" type="xs:anyURI" />
2025
<xs:element name="base64BinaryElement" type="xs:base64Binary" />
2126
<xs:element name="booleanElement" type="xs:boolean" />

XmlSchemaClassGenerator/Extensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public static class Extensions
1111
{
1212
public static XmlSchema GetSchema(this XmlSchemaObject xmlSchemaObject)
1313
{
14-
while (xmlSchemaObject != null && !(xmlSchemaObject is XmlSchema))
14+
while (xmlSchemaObject != null && !(xmlSchemaObject is XmlSchema))
1515
xmlSchemaObject = xmlSchemaObject.Parent;
1616
return (XmlSchema)xmlSchemaObject;
1717
}

XmlSchemaClassGenerator/TypeModel.cs

Lines changed: 45 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ public virtual CodeTypeReference GetReferenceFor(NamespaceModel referencingNames
185185
return new CodeTypeReference(name);
186186
}
187187

188-
public virtual CodeExpression GetDefaultValueFor(string defaultString)
188+
public virtual CodeExpression GetDefaultValueFor(string defaultString, bool attribute)
189189
{
190190
throw new NotSupportedException(string.Format("Getting default value for {0} not supported.", defaultString));
191191
}
@@ -398,13 +398,13 @@ public override CodeTypeDeclaration Generate()
398398

399399
if (IsMixed && (BaseClass == null || (BaseClass is ClassModel && !AllBaseClasses.Any(b => b.IsMixed))))
400400
{
401-
var propName = "Text";
401+
var propName = "Text";
402402

403403
// To not collide with any existing members
404404
for (var propertyIndex = 1; Properties.Any(x => x.Name.Equals(propName, StringComparison.Ordinal)) || propName.Equals(classDeclaration.Name, StringComparison.Ordinal); propertyIndex++)
405-
{
406-
propName = $"Text_{propertyIndex}";
407-
}
405+
{
406+
propName = $"Text_{propertyIndex}";
407+
}
408408
var text = new CodeMemberField(typeof(string[]), propName);
409409
// hack to generate automatic property
410410
text.Name += " { get; set; }";
@@ -456,7 +456,7 @@ public List<ClassModel> GetAllDerivedTypes()
456456
return allDerivedTypes;
457457
}
458458

459-
public override CodeExpression GetDefaultValueFor(string defaultString)
459+
public override CodeExpression GetDefaultValueFor(string defaultString, bool attribute)
460460
{
461461
var rootClass = AllBaseTypes.LastOrDefault();
462462

@@ -466,7 +466,7 @@ public override CodeExpression GetDefaultValueFor(string defaultString)
466466

467467
using (var writer = new System.IO.StringWriter())
468468
{
469-
CSharpProvider.GenerateCodeFromExpression(rootClass.GetDefaultValueFor(defaultString), writer, new CodeGeneratorOptions());
469+
CSharpProvider.GenerateCodeFromExpression(rootClass.GetDefaultValueFor(defaultString, attribute), writer, new CodeGeneratorOptions());
470470
val = writer.ToString();
471471
}
472472

@@ -480,7 +480,7 @@ public override CodeExpression GetDefaultValueFor(string defaultString)
480480
return dv;
481481
}
482482

483-
return base.GetDefaultValueFor(defaultString);
483+
return base.GetDefaultValueFor(defaultString, attribute);
484484
}
485485
}
486486

@@ -658,8 +658,8 @@ private CodeTypeReference TypeReference
658658
{
659659
get
660660
{
661-
return PropertyType.GetReferenceFor(OwningType.Namespace,
662-
collection: IsCollection || IsArray || (IsList && IsAttribute),
661+
return PropertyType.GetReferenceFor(OwningType.Namespace,
662+
collection: IsCollection || IsArray || (IsList && IsAttribute),
663663
attribute: IsAttribute);
664664
}
665665
}
@@ -680,6 +680,20 @@ private void AddDocs(CodeTypeMember member)
680680
member.Comments.AddRange(DocumentationModel.GetComments(docs).ToArray());
681681
}
682682

683+
private CodeAttributeDeclaration CreateDefaultValueAttribute(CodeTypeReference typeReference, CodeExpression defaultValueExpression)
684+
{
685+
var defaultValueAttribute = new CodeAttributeDeclaration(new CodeTypeReference(typeof(DefaultValueAttribute), Configuration.CodeTypeReferenceOptions));
686+
if (typeReference.BaseType == "System.Decimal")
687+
{
688+
defaultValueAttribute.Arguments.Add(new CodeAttributeArgument(new CodeTypeOfExpression(typeof(decimal))));
689+
defaultValueAttribute.Arguments.Add(new CodeAttributeArgument(new CodePrimitiveExpression(DefaultValue)));
690+
}
691+
else
692+
defaultValueAttribute.Arguments.Add(new CodeAttributeArgument(defaultValueExpression));
693+
694+
return defaultValueAttribute;
695+
}
696+
683697
public void AddInterfaceMembersTo(CodeTypeDeclaration typeDeclaration)
684698
{
685699
CodeTypeMember member;
@@ -706,12 +720,11 @@ public void AddInterfaceMembersTo(CodeTypeDeclaration typeDeclaration)
706720

707721
if (DefaultValue != null && IsNullable)
708722
{
709-
var defaultValueExpression = propertyType.GetDefaultValueFor(DefaultValue);
723+
var defaultValueExpression = propertyType.GetDefaultValueFor(DefaultValue, IsAttribute);
710724

711725
if ((defaultValueExpression is CodePrimitiveExpression) || (defaultValueExpression is CodeFieldReferenceExpression))
712726
{
713-
var defaultValueAttribute = new CodeAttributeDeclaration(new CodeTypeReference(typeof(DefaultValueAttribute), Configuration.CodeTypeReferenceOptions),
714-
new CodeAttributeArgument(defaultValueExpression));
727+
var defaultValueAttribute = CreateDefaultValueAttribute(typeReference, defaultValueExpression);
715728
member.CustomAttributes.Add(defaultValueAttribute);
716729
}
717730
}
@@ -759,7 +772,7 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi
759772
else
760773
member = new CodeMemberField(typeReference, propertyName);
761774

762-
var isPrivateSetter = IsCollection || isArray;
775+
var isPrivateSetter = IsCollection || isArray || (IsList && IsAttribute);
763776

764777
if (requiresBackingField)
765778
{
@@ -775,7 +788,7 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi
775788
}
776789
else
777790
{
778-
var defaultValueExpression = propertyType.GetDefaultValueFor(DefaultValue);
791+
var defaultValueExpression = propertyType.GetDefaultValueFor(DefaultValue, IsAttribute);
779792
backingField.InitExpression = defaultValueExpression;
780793

781794
if (IsNillableValueType)
@@ -791,8 +804,7 @@ public void AddMembersTo(CodeTypeDeclaration typeDeclaration, bool withDataBindi
791804

792805
if (IsNullable && ((defaultValueExpression is CodePrimitiveExpression) || (defaultValueExpression is CodeFieldReferenceExpression)))
793806
{
794-
var defaultValueAttribute = new CodeAttributeDeclaration(new CodeTypeReference(typeof(DefaultValueAttribute), Configuration.CodeTypeReferenceOptions),
795-
new CodeAttributeArgument(defaultValueExpression));
807+
var defaultValueAttribute = CreateDefaultValueAttribute(typeReference, defaultValueExpression);
796808
member.CustomAttributes.Add(defaultValueAttribute);
797809
}
798810
}
@@ -1139,7 +1151,7 @@ public override CodeTypeDeclaration Generate()
11391151
return enumDeclaration;
11401152
}
11411153

1142-
public override CodeExpression GetDefaultValueFor(string defaultString)
1154+
public override CodeExpression GetDefaultValueFor(string defaultString, bool attribute)
11431155
{
11441156
return new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(GetReferenceFor(referencingNamespace: null)),
11451157
Values.First(v => v.Value == defaultString).Name);
@@ -1221,9 +1233,16 @@ public override CodeTypeReference GetReferenceFor(NamespaceModel referencingName
12211233
return new CodeTypeReference(type, Configuration.CodeTypeReferenceOptions);
12221234
}
12231235

1224-
public override CodeExpression GetDefaultValueFor(string defaultString)
1236+
public override CodeExpression GetDefaultValueFor(string defaultString, bool attribute)
12251237
{
1226-
if (ValueType == typeof(XmlQualifiedName))
1238+
var type = ValueType;
1239+
1240+
if (XmlSchemaType != null)
1241+
{
1242+
type = XmlSchemaType.Datatype.GetEffectiveType(Configuration, Restrictions, attribute);
1243+
}
1244+
1245+
if (type == typeof(XmlQualifiedName))
12271246
{
12281247
if (defaultString.StartsWith("xs:", StringComparison.OrdinalIgnoreCase))
12291248
{
@@ -1235,6 +1254,12 @@ public override CodeExpression GetDefaultValueFor(string defaultString)
12351254
}
12361255
throw new NotSupportedException(string.Format("Resolving default value {0} for QName not supported.", defaultString));
12371256
}
1257+
else if (type == typeof(DateTime))
1258+
{
1259+
var rv = new CodeMethodInvokeExpression(new CodeTypeReferenceExpression(typeof(DateTime)), "Parse", new CodePrimitiveExpression(defaultString));
1260+
return rv;
1261+
}
1262+
12381263
return new CodePrimitiveExpression(Convert.ChangeType(defaultString, ValueType));
12391264
}
12401265

0 commit comments

Comments
 (0)