private void ImportElementMember(XmlSchemaElement element, string identifier, CodeIdentifiers members, CodeIdentifiers membersScope, INameScope elementsScope, string ns, bool repeats, ref bool needExplicitOrder, bool allowDuplicates, bool allowUnboundedElements)
{
repeats = repeats | element.IsMultipleOccurrence;
XmlSchemaElement headElement = GetTopLevelElement(element);
if (headElement != null && ImportSubstitutionGroupMember(headElement, identifier, members, membersScope, ns, repeats, ref needExplicitOrder, allowDuplicates))
{
return;
}
ElementAccessor accessor;
if ((accessor = ImportArray(element, identifier, ns, repeats)) == null)
{
accessor = ImportElement(element, identifier, typeof(TypeMapping), null, ns, false);
}
MemberMapping member = new MemberMapping();
string name = CodeIdentifier.MakeValid(Accessor.UnescapeName(accessor.Name));
member.Name = membersScope.AddUnique(name, member);
if (member.Name.EndsWith("Specified", StringComparison.Ordinal))
{
name = member.Name;
member.Name = membersScope.AddUnique(member.Name, member);
membersScope.Remove(name);
}
members.Add(member.Name, member);
// we do not support lists for elements
if (accessor.Mapping.IsList)
{
accessor.Mapping = GetDefaultMapping(TypeFlags.CanBeElementValue | TypeFlags.CanBeTextValue);
member.TypeDesc = accessor.Mapping.TypeDesc;
}
else
{
member.TypeDesc = accessor.Mapping.TypeDesc;
}
AddScopeElement(elementsScope, accessor, ref needExplicitOrder, allowDuplicates);
member.Elements = new ElementAccessor[] { accessor };
if (element.IsMultipleOccurrence || repeats)
{
if (!allowUnboundedElements && accessor.Mapping is ArrayMapping)
{
accessor.Mapping = ((ArrayMapping)accessor.Mapping).TopLevelMapping;
accessor.Mapping.ReferencedByTopLevelElement = false;
accessor.Mapping.ReferencedByElement = true;
}
member.TypeDesc = accessor.Mapping.TypeDesc.CreateArrayTypeDesc();
}
if (element.MinOccurs == 0 && member.TypeDesc.IsValueType && !element.HasDefault && !member.TypeDesc.HasIsEmpty)
{
member.CheckSpecified = SpecifiedAccessor.ReadWrite;
}
}