【发布时间】:2016-01-13 16:58:44
【问题描述】:
我想编写一个方法来确保我的树中的所有 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;
}
}
这是我的输出:
类程序 { 静态无效主() { 如果(真){{
Console.WriteL ine("这是真的!"); }}
如果(假){
Console.WriteLi ne("它是假的!"); }
} }
如您所见,第一个 if 语句后面的代码块有两次括号(不是),而第二个 if 语句后面的代码块只有一次括号(如预期的那样) )。
我确信我对 Roslyn 的工作方式有一些错误的假设,所以有人会告诉我哪里出了问题吗?我应该做出哪些改变?
【问题讨论】: