private XmlSchemaSimpleType[] CompileBaseMemberTypes(XmlSchemaSimpleType simpleType) {
XmlSchemaSimpleType unionMember;
ArrayList memberTypeDefinitions = new ArrayList();
XmlSchemaSimpleTypeUnion mainUnion = (XmlSchemaSimpleTypeUnion)simpleType.Content;
Array mainMemberTypes = mainUnion.MemberTypes;
if (mainMemberTypes != null) {
foreach(XmlQualifiedName memberName in mainMemberTypes) {
unionMember = GetSimpleType(memberName);
if (unionMember != null) {
if (unionMember.Datatype.Variety == XmlSchemaDatatypeVariety.Union) { //union of union
CheckUnionType(unionMember, memberTypeDefinitions, simpleType);
}
else { //its list or atomic
memberTypeDefinitions.Add(unionMember);
}
//Check derivation method of the member that is referenced
if ((unionMember.FinalResolved & XmlSchemaDerivationMethod.Union) != 0) {
SendValidationEvent(Res.Sch_BaseFinalUnion, simpleType);
}
}
else {
throw new XmlSchemaException(Res.Sch_UndeclaredSimpleType, memberName.ToString(), mainUnion);
}
}
}
//Now add the baseTypes that are defined inside the union itself
XmlSchemaObjectCollection mainBaseTypes = mainUnion.BaseTypes; //TODO check for null
if (mainBaseTypes != null) {
foreach(XmlSchemaSimpleType st in mainBaseTypes) {
CompileSimpleType(st);
if (st.Datatype.Variety == XmlSchemaDatatypeVariety.Union) { //union of union
CheckUnionType(st, memberTypeDefinitions, simpleType);
}
else { //its list or atomic
memberTypeDefinitions.Add(st);
}
}
}
//set all types
mainUnion.SetBaseMemberTypes(memberTypeDefinitions.ToArray(typeof(XmlSchemaSimpleType)) as XmlSchemaSimpleType[]);
return mainUnion.BaseMemberTypes;
}