C# 重写if语句:其中一条语句的括号过多

C# 重写if语句:其中一条语句的括号过多,c#,roslyn,C#,Roslyn,我想写一个方法来确保我树中的所有if语句后面都跟有大括号的代码块。这是我的密码: class Program { static void Main(string[] args) { var tree = CSharpSyntaxTree.ParseText(@" class Program

我想写一个方法来确保我树中的所有if语句后面都跟有大括号的代码块。这是我的密码:

class Program
{
    static void Main(string[] args)
    {
        var tree = CSharpSyntaxTree.ParseText(@"
                                                class Program
                                                {
                                                    static void main()
                                                    {
                                                        if(true)
                                                            Console.WriteLine(""It was true!"");
                                                        if(false)
                                                            Console.WriteLine(""It was false!"");
                                                    }
                                                }");

        var root = tree.GetRoot();
        var rewriter = new MyRewriter();

        var newRoot = rewriter.Visit(root);
        var ifStatements = newRoot.DescendantNodes().OfType<IfStatementSyntax>();

        foreach (var ifStatement in ifStatements)
        {
            SyntaxNode newIfStatement = rewriter.VisitIfStatement(ifStatement);
            newRoot = newRoot.ReplaceNode(ifStatement, newIfStatement);
        }

        var result = newRoot;

        Console.WriteLine(result.ToString());
        Console.ReadKey();
    }
}

public class MyRewriter: CSharpSyntaxRewriter
{
    public override SyntaxNode VisitIfStatement(IfStatementSyntax node)
    {
        var body = node.Statement;
        var block = SyntaxFactory.Block(body);
        var newIfStatement = node.WithStatement(block);

        return newIfStatement;
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var tree=CSharpSyntaxTree.ParseText(@)
班级计划
{
静态void main()
{
如果(真)
WriteLine(“这是真的!”);
if(false)
Console.WriteLine(“它是假的!”);
}
}");
var root=tree.GetRoot();
var rewriter=new MyRewriter();
var newRoot=rewriter.Visit(root);
var ifStatements=newRoot.degenantNodes(),of type();
foreach(IFVAR语句中的IFVAR语句)
{
SyntaxNode newIfStatement=重写器.VisitIfStatement(ifStatement);
newRoot=newRoot.ReplaceNode(ifStatement,newIfStatement);
}
var结果=newRoot;
Console.WriteLine(result.ToString());
Console.ReadKey();
}
}
公共类MyRewriter:CSharpSyntaxRewriter
{
公共重写SyntaxNode VisitIfStatement(IfStatementSyntax节点)
{
var body=node.Statement;
var block=SyntaxFactory.block(body);
var newIfStatement=node.with语句(块);
返回newIfStatement;
}
}
以下是我的输出:

班级计划 { 静态void main() { 如果(真){{
Console.WriteL ine(“这是真的!”;}}
如果(假){
Console.WriteLi-ne(“它是假的!”;}
} }

正如您所看到的,第一个if语句后面的代码块用大括号括起来两次(不是预期的),而第二个if语句后面的代码块只用大括号括起来一次(预期的)


我确信我对Roslyn的工作方式有一些错误的假设,所以有人能告诉我哪里出了问题吗?我应该做什么改变

您混合了两件事:要么使用
SyntaxRewriter
,要么“手动”完成。现在您正在同时执行这两项操作:首先调用重写器,然后循环遍历其所有节点,并在每个
IfStatementSyntax
上再次调用重写器

  • 修复所有
    if
    语句:
    var newRoot=rewriter.Visit(root)

  • 手动替换所有
    if
    语句:


非常感谢你的帮助!你能解释一下为什么你建议我应用格式吗?因为如果你在打印时没有注释,它看起来是这样的:那不是很漂亮;-)通过注释,您可以得到以下结果:
var ifStatements = newRoot.DescendantNodes().OfType<IfStatementSyntax>();

foreach (var ifStatement in ifStatements)
{
    SyntaxNode newIfStatement = rewriter.VisitIfStatement(ifStatement);
    newRoot = newRoot.ReplaceNode(ifStatement, newIfStatement);
}
var newRoot = rewriter.Visit(root).WithAdditionalAnnotations(Formatter.Annotation);
var result = Formatter.Format(newRoot, Formatter.Annotation, new AdhocWorkspace());