private TypeMapping ImportElementType(XmlSchemaElement element, string identifier, Type desiredMappingType, Type baseType, string ns)
{
TypeMapping mapping;
if (!element.SchemaTypeName.IsEmpty)
{
mapping = ImportType(element.SchemaTypeName, desiredMappingType, baseType, TypeFlags.CanBeElementValue, false);
if (!mapping.ReferencedByElement)
{
object type = FindType(element.SchemaTypeName, TypeFlags.CanBeElementValue);
XmlSchemaObject parent = element;
while (parent.Parent != null && type != parent)
{
parent = parent.Parent;
}
mapping.ReferencedByElement = (type != parent);
}
}
else if (element.SchemaType != null)
{
if (element.SchemaType is XmlSchemaComplexType)
mapping = ImportType((XmlSchemaComplexType)element.SchemaType, ns, identifier, desiredMappingType, baseType, TypeFlags.CanBeElementValue);
else
mapping = ImportDataType((XmlSchemaSimpleType)element.SchemaType, ns, identifier, baseType, TypeFlags.CanBeElementValue | TypeFlags.CanBeAttributeValue | TypeFlags.CanBeTextValue, false);
mapping.ReferencedByElement = true;
}
else if (!element.SubstitutionGroup.IsEmpty)
mapping = ImportElementType(FindElement(element.SubstitutionGroup), identifier, desiredMappingType, baseType, ns);
else
{
if (desiredMappingType == typeof(MembersMapping))
{
mapping = ImportMembersType(new XmlSchemaType(), ns, identifier);
}
else
{
mapping = ImportRootMapping();
}
}
if (!(desiredMappingType.IsAssignableFrom(mapping.GetType())))
throw new InvalidOperationException(SR.Format(SR.XmlElementImportedTwice, element.Name, ns, mapping.GetType().Name, desiredMappingType.Name));
// let the extensions to run
if (!mapping.TypeDesc.IsMappedType)
{
RunSchemaExtensions(mapping, element.SchemaTypeName, element.SchemaType, element, TypeFlags.CanBeElementValue);
}
return mapping;
}