NullableMapping CreateNullableMapping(TypeMapping baseMapping, TypeDesc typeDesc) {
TypeMapping existingMapping = (TypeMapping)types[typeDesc.Name, baseMapping.Namespace];
NullableMapping mapping;
if (existingMapping != null) {
if (existingMapping is NullableMapping) {
mapping = (NullableMapping)existingMapping;
if (mapping.BaseMapping is PrimitiveMapping && baseMapping is PrimitiveMapping)
return mapping;
else if (mapping.BaseMapping == baseMapping) {
return mapping;
}
else {
throw new InvalidOperationException(Res.GetString(Res.XmlTypesDuplicate, typeDesc.FullName, existingMapping.TypeDesc.FullName, typeDesc.Name, existingMapping.Namespace));
}
}
else if (!(baseMapping is PrimitiveMapping)){
throw new InvalidOperationException(Res.GetString(Res.XmlTypesDuplicate, typeDesc.FullName, existingMapping.TypeDesc.FullName, typeDesc.Name, existingMapping.Namespace));
}
}
mapping = new NullableMapping();
mapping.BaseMapping = baseMapping;
mapping.TypeDesc = typeDesc;
mapping.TypeName = baseMapping.TypeName;
mapping.Namespace = baseMapping.Namespace;
mapping.IncludeInSchema = false; //baseMapping.IncludeInSchema;
types.Add(typeDesc.Name, baseMapping.Namespace, mapping);
typeScope.AddTypeMapping(mapping);
return mapping;
}