private ClrPropertyInfo BuildComplexTypeTextProperty(XmlSchemaElement parentElement, XmlSchemaComplexType schemaType) { Debug.Assert(schemaType != null); Debug.Assert(schemaType.GetContentType() == XmlSchemaContentType.TextOnly); ClrPropertyInfo textProperty = new ClrPropertyInfo(Constants.SInnerTypePropertyName, string.Empty, Constants.SInnerTypePropertyName, Occurs.One); textProperty.Origin = SchemaOrigin.Text; ClrTypeReference typeRef = null; bool anonymous = false; //Could be derived by restriction or extension //If first time extension, make the base simple type as the type reference XmlSchemaType baseType = schemaType.BaseXmlSchemaType; if (baseType is XmlSchemaSimpleType) { typeRef = BuildTypeReference(baseType, baseType.QualifiedName, false, true); anonymous = false; if (!textPropInheritanceTracker.ContainsKey(schemaType)) { textPropInheritanceTracker.Add(schemaType, textProperty); } } else if (schemaType.HasFacetRestrictions()) { //Derived by restriction, represents the content type with restrictions as a local type //Make the base simple type as the type reference so that we know if it is a list, union or atomic XmlSchemaSimpleType st = schemaType.GetBaseSimpleType(); Debug.Assert(st != null); typeRef = BuildTypeReference(st, st.QualifiedName, true, true); typeRef.Validate = true; anonymous = true; //Also get its base complex type and see if we need to override the content property ClrPropertyInfo baseProp = null; if (textPropInheritanceTracker.TryGetValue(baseType, out baseProp)) { textProperty.IsOverride = true; if (!baseProp.IsOverride) { baseProp.IsVirtual = true; } } } else { return(null); } if (anonymous) { //anonymous type, fixed up the name later, treat complex type with restrictions as an anonymous type //because we need to generate a type to encapsualte these restrictions if (parentElement != null) { string identifier = localSymbolTable.AddLocalElement(parentElement); localSymbolTable.AddAnonymousType(identifier, parentElement, typeRef); } else { localSymbolTable.AddComplexRestrictedContentType(schemaType, typeRef); } } textProperty.TypeReference = typeRef; return(textProperty); }
private ClrPropertyInfo BuildComplexTypeTextProperty(XmlSchemaElement parentElement, XmlSchemaComplexType schemaType) { string identifier; ClrPropertyInfo clrPropertyInfo; Debug.Assert(schemaType != null); Debug.Assert(schemaType.GetContentType() == XmlSchemaContentType.TextOnly); ClrPropertyInfo textProperty = new ClrPropertyInfo("TypedValue", string.Empty, "TypedValue", Occurs.One) { Origin = SchemaOrigin.Text }; ClrTypeReference typeRef = null; bool anonymous = false; XmlSchemaType baseType = schemaType.BaseXmlSchemaType; if (!(baseType is XmlSchemaSimpleType)) { if (schemaType.HasFacetRestrictions()) { goto Label1; } clrPropertyInfo = null; return(clrPropertyInfo); } else { typeRef = this.BuildTypeReference(baseType, baseType.QualifiedName, false, true); anonymous = false; if (!this.textPropInheritanceTracker.ContainsKey(schemaType)) { this.textPropInheritanceTracker.Add(schemaType, textProperty); } } if (anonymous) { if (parentElement == null) { this.localSymbolTable.AddComplexRestrictedContentType(schemaType, typeRef); } else { identifier = this.localSymbolTable.AddLocalElement(parentElement); this.localSymbolTable.AddAnonymousType(identifier, parentElement, typeRef); } } textProperty.TypeReference = typeRef; clrPropertyInfo = textProperty; return(clrPropertyInfo); Label1: XmlSchemaSimpleType st = schemaType.GetBaseSimpleType(); Debug.Assert(st != null); typeRef = this.BuildTypeReference(st, st.QualifiedName, true, true); typeRef.Validate = true; anonymous = true; ClrPropertyInfo baseProp = null; if (this.textPropInheritanceTracker.TryGetValue(baseType, out baseProp)) { textProperty.IsOverride = true; if (!baseProp.IsOverride) { baseProp.IsVirtual = true; } } if (anonymous) { if (parentElement == null) { this.localSymbolTable.AddComplexRestrictedContentType(schemaType, typeRef); } else { identifier = this.localSymbolTable.AddLocalElement(parentElement); this.localSymbolTable.AddAnonymousType(identifier, parentElement, typeRef); } } textProperty.TypeReference = typeRef; clrPropertyInfo = textProperty; return(clrPropertyInfo); }