Fractionnement des déclarations d’expression avec Roslyn

Je travaille au développement d’une application qui reformule le code CSharp . Je fais ça avec Roslyn . Je suis confronté à un problème de splitting expressions .

Classe d’échantillon

 class Program { static void Main(ssortingng[] args) { float floatVariable = 20; Int16 intVariable = 10; ssortingng str = "School"; Console.Write(str + floatVariable.ToSsortingng() + intVariable.ToSsortingng()); // Facing problem with this statement } } 

Exemple de code que j’utilise

 ssortingng code = new StreamReader(classPath).ReadToEnd(); var syntaxTree = CSharpSyntaxTree.ParseText(code); var syntaxRoot = syntaxTree.GetRoot(); //This will get the method and local variables declared inside the method var MyMethods = syntaxRoot.DescendantNodes().OfType(); foreach (MethodDeclarationSyntax mds in MyMethods) { syntaxTree = CSharpSyntaxTree.ParseText(mds.ToFullSsortingng()); IEnumerable nodes = syntaxTree.GetRoot().DescendantNodes(); IEnumerable variableDeclarations = nodes.OfType(); foreach (VariableDeclarationSyntax variable in variableDeclarations) { // I will collect the variable details like Datatype, variable names and initialized values here } foreach (StatementSyntax statement in mds.Body.Statements) { if (statement.CSharpKind() == SyntaxKind.ExpressionStatement) { //I want to split the expressions "Console.Write(str + floatVariable.ToSsortingng() + intVariable.ToSsortingng());" as below //1. intVariable.ToSsortingng() //2. floatVariable.ToSsortingng() //3. str //Then I have to find the whole data type from the resolved result of above 3 => ssortingng here } } } 

Toute aide serait appréciée.

Edit: je ne parviens pas à fractionner les instructions d’expression paramétrées. J’essaie de le faire en

 if (statement.CSharpKind() == SyntaxKind.ExpressionStatement) { ExpressionStatementSyntax expression = statement as ExpressionStatementSyntax; var expressions = expression.Expression.DescendantNodes(); } 

Mais cela divise chaque jeton en un élément séparé. Je veux juste scinder le Console.Write(str + floatVariable.ToSsortingng() + intVariable.ToSsortingng()) en,

  1. Console.Write ()
  2. str
  3. intVariable.ToSsortingng ()
  4. floatVariable.ToSsortingng ()

Il est difficile de dire exactement ce que vous voulez faire, car vous avez spécifié ce que le code ne devrait faire que dans un cas spécifique, pas en général.

La façon dont je l’interprète est:

  1. Pour l’expression d’invocation, retourne l’expression qui est appelée et descend également dans ses arguments, le cas échéant.
  2. Pour les opérateurs binarys, descendez dans les deux enfants.
  3. Pour toutes les autres expressions, retournez directement l’expression.

Avec cette spécification et en utilisant CSharpSyntaxVisitor , le code pourrait ressembler à ceci:

 public static IEnumerable Split(ExpressionSyntax expression) { return new SplitVisitor().Visit(expression); } class SplitVisitor : CSharpSyntaxVisitor> { public override IEnumerable VisitInvocationExpression( InvocationExpressionSyntax node) { yield return node.Expression; var argumentExpressions = node.ArgumentList.Arguments .SelectMany(a => Visit(a.Expression)); foreach (var expression in argumentExpressions) yield return expression; } public override IEnumerable VisitBinaryExpression( BinaryExpressionSyntax node) { foreach (var expression in Visit(node.Left)) yield return expression; foreach (var expression in Visit(node.Right)) yield return expression; } public override IEnumerable DefaultVisit(SyntaxNode node) { var expression = node as ExpressionSyntax; if (expression != null) yield return expression; } }