【发布时间】:2015-05-08 14:30:53
【问题描述】:
我在使用 Roslyn 向 SyntaxTree 添加表达式时遇到了一些问题。我需要实现的是: 每当我找到一个特殊的语句时,我想在该语句之后插入一个或多个表达式。
假设我想在每个写入变量“testVar”的语句之后插入语句“myVar = myVar + 1”。
所以下面的sn-p:
a = 10;
testVar = 50;
a = testVar / a;
testVar = a;
应该变成这段代码:
a = 10;
testVar = 50;
myVar = myVar + 1;
a = testVar / a;
testVar = a;
myVar = myVar + 1;
我当前的方法使用带有方法“SyntaxNode VisitExpressionStatement(ExpressionStatement node)”的 SyntaxVisitor。 此方法访问 SyntaxTree 中的所有表达式,并允许用它返回的 SyntaxNode 替换访问的表达式。 但是,我不想替换语句,而是在它们之后添加新的表达式,这基本上需要返回两个表达式。 我发现的唯一解决方案是使用“BlockSyntax”作为两个表达式的容器(参见代码 sn-p [0])。不幸的是,“BlockSyntax”在自身周围引入了花括号,导致以下结果:
a = 10;
{
testVar = 50;
myVar = myVar + 1;
}
a = testVar / a;
{
testVar = a;
myVar = myVar + 1;
}
这种方法对我来说是不可接受的,因为我不想操纵范围。 有什么方法可以在我使用 Roslyn 选择的位置插入任意表达式?
[0]
public SyntaxNode VisitExpressionStatement(ExpressionStatement node){
if(node has special characteristics){
var newExpression = ...
var newStatmentList = new Roslyn.Compilers.CSharp.SyntaxList<StatementSyntax>();
newStatmentList = newStatmentList.Insert(newStatmentList.Count, node);
newStatmentList = newStatmentList.Insert(newStatmentList.Count, newExpression);
BlockSyntax newBlock = Syntax.Block(newStatmentList);
return newBlock;
}
else {
return node;
}
}
【问题讨论】: