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.
fonte
2012-06-13 14:34:20
È possibile generare grafico dai risultati di questa query? il problema che ottengo è che gli usi tramite override non sono mostrati ... – ironic
no per ora edge on graph mostra solo dipendenze "reali", questa situazione si evolverà –