internal Type GetType(Universe universe, Module context, bool throwOnError, string originalName, bool resolve, bool ignoreCase)
{
Debug.Assert(!resolve || !ignoreCase);
TypeName name = TypeName.Split(this.name);
Type type;
if (assemblyName != null)
{
Assembly asm = universe.Load(assemblyName, context, throwOnError);
if (asm == null)
{
return(null);
}
if (resolve)
{
type = asm.ResolveType(context, name);
}
else if (ignoreCase)
{
type = asm.FindTypeIgnoreCase(name.ToLowerInvariant());
}
else
{
type = asm.FindType(name);
}
}
else if (context == null)
{
if (resolve)
{
type = universe.Mscorlib.ResolveType(context, name);
}
else if (ignoreCase)
{
type = universe.Mscorlib.FindTypeIgnoreCase(name.ToLowerInvariant());
}
else
{
type = universe.Mscorlib.FindType(name);
}
}
else
{
if (ignoreCase)
{
name = name.ToLowerInvariant();
type = context.FindTypeIgnoreCase(name);
}
else
{
type = context.FindType(name);
}
if (type == null && context != universe.Mscorlib.ManifestModule)
{
if (ignoreCase)
{
type = universe.Mscorlib.FindTypeIgnoreCase(name);
}
else
{
type = universe.Mscorlib.FindType(name);
}
}
if (type == null && resolve)
{
if (universe.Mscorlib.__IsMissing && !context.__IsMissing)
{
type = universe.Mscorlib.ResolveType(context, name);
}
else
{
type = context.Assembly.ResolveType(context, name);
}
}
}
return(Expand(type, context, throwOnError, originalName, resolve, ignoreCase));
}