clic derecho en cualquier parte de un método de la interfaz de usuario, y seleccionar el menú: Seleccionar método ...> ... que están usando mi (directa o indirectamente) conduce a una consulta de código como:
from m in Methods
let depth0 = m.DepthOfIsUsing("NUnit.Core.NUnitFramework+Assert.GetAssertCount()")
where depth0 >= 0 orderby depth0
select new { m, depth0 }
El problema es que dicha consulta da un uso indirecto, pero no busca las llamadas que ocurren a través de una interfaz (o un método reemplazado declarado en una clase base).
Esperamos que lo que está pidiendo se puede obtener con esta consulta:
// Retrieve the target method by name
let methodTarget = Methods.WithFullName("NUnit.Core.NUnitFramework+Assert.GetAssertCount()").Single()
// Build a ICodeMetric<IMethod,ushort> representing the depth of indirect
// call of the target method.
let indirectCallDepth =
methodTarget.ToEnumerable()
.FillIterative(
methods => methods.SelectMany(
m => m.MethodsCallingMe.Union(m.OverriddensBase)))
from m in indirectCallDepth.DefinitionDomain
select new { m, callDepth = indirectCallDepth[m] }
Las dos piedras angulares de esta consulta son:
- La llamada a FillIterative() para seleccionar de forma recursiva la llamada indirecta.
- Llamada a la propiedad IMethod.OverriddensBase, como su nombre indica. Para un método M, esto devuelve el enumerable de todos los métodos declarados en una clase base o una interfaz, anulada por M.
¿Es posible generar un gráfico a partir de los resultados de esta consulta? el problema que tengo es que no se muestran los usos a través de anulaciones ... – ironic
no por ahora el borde en el gráfico solo muestra dependencias "reales", esta situación evolucionará –