Roslyn найти рекурсивные методы и добавить в них выражение
Найти в коде все рекурсивные метды и добавить в них выражение
Проблема в том, что если я хочу попробовать вставить свой блок в рекурсивный метод, то может произойти ситуация если в шапке метода (модификатор или любое что либо будет иметь пробелы) Все таки мне кажется что подход мой не очень хороший. А можно как то решить эту задачу буквально в одну строку с помощью анализатора. В нем есть такие штуки как вставка сразу в тело нужной
Идея моя в том, что я хочу собрать по структуре полностью такой же метод с пробелами или еще с чем то. Удалить его с кода. Потом сделать свой и добавить его в код. Ну все же мне кажется это не очень хорошая идея. И она на данный момент не рабочая потому что я не получаю полного метода сразу в таком виде как он есть, а только его складываю по кускам.
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static class StaticCount {public static count { get; set; }}
static void Main(string[] args)
{
string sourcCode = @"using System;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(""Hello World!111""); // Hello World
Foo(); // Foo() { Foo(); }
NormalFunc(); /*static void NormalFunc() { Console.WriteLine(""Hello World!111""); }*/
}
static void Foo()
{
Foo();
}
static void NormalFunc() { Console.WriteLine(""Hello World!111""); }
}
};";
string expression = "StaticCount.count++;if(StaticCount.count> 1500) throw new Exception();";
SyntaxTree tree = CSharpSyntaxTree.ParseText(sourcCode);
IEnumerable<MethodDeclarationSyntax> methods = tree
.GetRoot()
.DescendantNodes()
.OfType<MethodDeclarationSyntax>();
foreach (var method in methods)
{
string methodModifire = method.Modifiers.ToString().Replace(" ", "");
string methodReturn = method.ReturnType.ToString().Replace(" ", "");
string methodName = method.Identifier.ToString().Replace(" ", "");
string methodParams = method.ParameterList.ToString().Replace(" ", "");
string methodBody = method.Body.ToString().Replace(" ", "");
if (methodBody.Contains(methodName + "("))
{
Console.WriteLine("RECURSION!!!!!!!!!!!!!!!");
sourcCode = sourcCode.Replace(" ", "").Replace(methodModifire +
methodReturn +
methodName +
methodParams +
methodBody, "");
// methodBody = methodBody.Insert(1, "++count;if(count > 1500) throw new Exception();");
Console.WriteLine(sourcCode);
}
}
}
}
}
Ответы (1 шт):
Проблему со стеком решил вот так пока.
string expressionParent = "static class StackOverflowCheck {public int StackCount { get; set; }}";
string expressionMethod = "StackOverflowCheck.StackCount++;if(StackOverflowCheck.StackCount > 1500) throw new Exception();";
SyntaxTree tree = CSharpSyntaxTree.ParseText(sourcCode);
IEnumerable<MethodDeclarationSyntax> methods = tree
.GetRoot()
.DescendantNodes()
.OfType<MethodDeclarationSyntax>();
foreach (var method in methods)
{
string methodModifire = method.Modifiers.ToString();
string methodReturn = method.ReturnType.ToString();
string methodName = method.Identifier.ToString();
string methodParams = method.ParameterList.ToString();
string methodBody = method.Body.ToString();
//Заменить старое тело на нвоое.
if (methodBody.Contains(methodName))
{
string bodyOld = methodBody;
methodBody = methodBody.Insert(1, expressionMethod);
sourcCode = sourcCode.Replace(bodyOld, methodBody);
}
}