2012-06-13 13 views

Respuesta

6

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.
+1

¿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

+1

no por ahora el borde en el gráfico solo muestra dependencias "reales", esta situación evolucionará –

Cuestiones relacionadas