private void EnqueueReachableTypes(RealSchemaType rsType)
{
Util.Log("SdlGenerator.EnqueueReachableTypes ");
// Get the XML namespace object
XMLNamespace xns = rsType.XNS;
// Process base type
if (rsType.Type.BaseType != null)
AddType(rsType.Type.BaseType, xns);
// Check if this is a suds type
bool bSUDSType = rsType.Type.IsInterface ||
s_marshalByRefType.IsAssignableFrom(rsType.Type) ||
s_delegateType.IsAssignableFrom(rsType.Type);
if (bSUDSType)
{
// Process implemented interfaces
Type[] interfaces = rsType.GetIntroducedInterfaces();
if (interfaces.Length > 0)
{
for (int i=0;i<interfaces.Length;i++)
{
Util.Log("SdlGenerator.EnqueueReachableTypes Interfaces "+interfaces[i].Name+" "+xns.Name);
AddType(interfaces[i], xns);
}
}
// Process methods
MethodInfo[] methods = rsType.GetIntroducedMethods();
if (methods.Length > 0)
{
String methodNSString = null;
XMLNamespace methodXNS = null;
if (xns.IsInteropType)
{
methodNSString = xns.Name;
methodXNS = xns;
}
else
{
StringBuilder sb = new StringBuilder();
sb.Append(xns.Name);
sb.Append('.');
sb.Append(rsType.Name);
methodNSString = sb.ToString();
methodXNS = AddNamespace(methodNSString, xns.Assem);
xns.DependsOnSchemaNS(methodXNS);
}
for (int i=0;i<methods.Length;i++)
{
MethodInfo method = methods[i];
Util.Log("SdlGenerator.EnqueueReachableTypes methods "+method.Name+" "+methodXNS.Name);
AddType(method.ReturnType, methodXNS);
ParameterInfo[] parameters = method.GetParameters();
for (int j=0;j<parameters.Length;j++)
AddType(parameters[j].ParameterType, methodXNS);
}
}
}
else
{
// Process fields
FieldInfo[] fields = rsType.GetInstanceFields();
for (int i=0;i<fields.Length;i++)
{
if (fields[i].FieldType == null)
continue;
AddType(fields[i].FieldType, xns);
}
}
return;
}