tipos suma sirve resueltos recursivo recursividad recursiva que primo para numero indirecta ejercicios c# visual-studio recursion resharper code-analysis

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.