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