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);
        }