private IEnumerable<IGenericParameter> FindGenericParameters(IType type)
{
IGenericParameter genericParameter = type as IGenericParameter;
if (genericParameter != null && _inferredTypes.ContainsKey(genericParameter))
{
yield return genericParameter;
}
if (type is IArrayType)
{
foreach (IGenericParameter gp in FindGenericParameters(type.GetElementType())) yield return gp;
yield break;
}
if (type.ConstructedInfo != null)
{
foreach (IType typeArgument in type.ConstructedInfo.GenericArguments)
{
foreach (IGenericParameter gp in FindGenericParameters(typeArgument)) yield return gp;
}
yield break;
}
ICallableType callableType = type as ICallableType;
if (callableType != null)
{
CallableSignature signature = callableType.GetSignature();
foreach (IGenericParameter gp in FindGenericParameters(signature.ReturnType)) yield return gp;
foreach (IParameter parameter in signature.Parameters)
{
foreach (IGenericParameter gp in FindGenericParameters(parameter.Type)) yield return gp;
}
yield break;
}
}