public void DoExpandBaseInterfaces ()
{
if ((caching_flags & Flags.InterfacesExpanded) != 0)
return;
caching_flags |= Flags.InterfacesExpanded;
//
// Expand base interfaces. It cannot be done earlier because all partial
// interface parts need to be defined before the type they are used from
//
if (iface_exprs != null) {
foreach (var iface in iface_exprs) {
if (iface == null)
continue;
var td = iface.MemberDefinition as TypeDefinition;
if (td != null)
td.DoExpandBaseInterfaces ();
if (iface.Interfaces == null)
continue;
foreach (var biface in iface.Interfaces) {
if (spec.AddInterfaceDefined (biface)) {
TypeBuilder.AddInterfaceImplementation (biface.GetMetaInfo ());
}
}
}
}
//
// Include all base type interfaces too, see ImportTypeBase for details
//
if (base_type != null) {
var td = base_type.MemberDefinition as TypeDefinition;
if (td != null)
td.DoExpandBaseInterfaces ();
//
// Simply use base interfaces only, they are all expanded which makes
// it easy to handle generic type argument propagation with single
// inflator only.
//
// interface IA<T> : IB<T>
// interface IB<U> : IC<U>
// interface IC<V>
//
if (base_type.Interfaces != null) {
foreach (var iface in base_type.Interfaces) {
spec.AddInterfaceDefined (iface);
}
}
}
}