/// <summary>
/// Parameterize the specified method (reuse if generic
/// parameterization isn't necessary).
/// </summary>
internal Method parameterize(Method m)
{
// if not generic, short circuit and reuse original
if (!m.isGenericMethod())
{
return(m);
}
// new signature
Func func = m.m_func;
Type ret;
List pars = new List(Sys.ParamType, m.m_params.sz());
// parameterize return type
if (func.returns().isGenericParameter())
{
ret = parameterize(func.returns());
}
else
{
ret = func.returns();
}
// narrow pars (or just reuse if not parameterized)
for (int i = 0; i < m.m_params.sz(); i++)
{
Param p = (Param)m.m_params.get(i);
if (p.m_type.isGenericParameter())
{
pars.add(new Param(p.m_name, parameterize(p.m_type), p.m_mask));
}
else
{
pars.add(p);
}
}
Method pm = new Method(this, m.m_name, m.m_flags, m.m_facets, m.m_lineNum, ret, m.m_inheritedReturns, pars, m);
pm.m_reflect = m.m_reflect;
return(pm);
}