suma - Detectar llamadas recursivas en código C#
suma recursiva c# (1)
Quiero encontrar todas las llamadas recursivas en mi código.
Si abro un archivo en Visual Studio, aparece el icono "Llamada recursiva" en el lado izquierdo del Editor.
Quiero inspeccionar toda la solución para tales llamadas.
Usé las herramientas de la línea de comandos de Resharper y el complemento de VS Resharper - Inspección de código sin suerte, esta regla no se aplica en su conjunto de reglas.
¿Hay alguna forma de que pueda inspeccionar la solución completa? Realmente no quiero abrir cada archivo y buscar el ícono azul de "Llamada recursiva" :)
Edit: Estoy interesado en la recursión de un solo nivel
Podrías hacerlo con Mono.Cecil .
Aquí hay un programa LINQPad simple que demuestra:
const string AssemblyFilePath = @"path/to/assembly.dll";
void Main()
{
var assembly = ModuleDefinition.ReadModule(AssemblyFilePath);
var calls =
(from type in assembly.Types
from caller in type.Methods
where caller != null && caller.Body != null
from instruction in caller.Body.Instructions
where instruction.OpCode == OpCodes.Call
let callee = instruction.Operand as MethodReference
select new { type, caller, callee }).Distinct();
var directRecursiveCalls =
from call in calls
where call.callee == call.caller
select call.caller;
foreach (var method in directRecursiveCalls)
Debug.WriteLine(method.DeclaringType.Namespace + "." + method.DeclaringType.Name + "." + method.Name + " calls itself");
}
Esto dará salida a los métodos que se llaman directamente. Tenga en cuenta que solo procesé la instrucción de Call , no estoy seguro de cómo manejar las otras instrucciones de llamada correctamente aquí, o incluso si eso es posible.
Advertencia : tenga en cuenta que esta voluntad, porque solo manejé esa única instrucción, solo funcionará con llamadas compiladas estáticamente.
Las llamadas virtuales, llamadas a través de interfaces, que simplemente vuelven al mismo método, no serán detectadas por esto, para eso es necesario un código mucho más avanzado.