2012-06-13 30 views

risposta

6

destro cliccando su un metodo in qualsiasi punto della UI, e selezionando il menu: Seleziona metodo ...> ... che utilizzano me (direttamente o indirettamente) porta ad una richiesta del codice del tipo:

from m in Methods 
let depth0 = m.DepthOfIsUsing("NUnit.Core.NUnitFramework+Assert.GetAssertCount()") 
where depth0 >= 0 orderby depth0 
select new { m, depth0 } 

Il problema è che tale query fornisce un utilizzo indiretto, ma non cerca chiamate che si verificano tramite un'interfaccia (o un metodo sottoposto a override dichiarato in una classe base).

Speriamo che quello che stai chiedendo può essere ottenuto con questa query:

// 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] } 

Le due pietre angolari di questa query sono:

  • La chiamata a FillIterative() per selezionare in modo ricorsivo la chiamata indiretta.
  • La chiamata alla proprietà IMethod.OverriddensBase, come suggerisce il nome. Per un metodo M restituisce l'enumerabile di tutto il metodo dichiarato in una classe base o in un'interfaccia, sostituito da M.
+1

È possibile generare grafico dai risultati di questa query? il problema che ottengo è che gli usi tramite override non sono mostrati ... – ironic

+1

no per ora edge on graph mostra solo dipendenze "reali", questa situazione si evolverà –

Problemi correlati