2014-10-20 103 views
1

我正试图为集合初始化程序及其相应的代码修复提供程序实现诊断分析程序。不能专门遍历语法树吗?

错误代码:

var sampleList= new List<string>(); 
sampleList.Add(""); 
sampleList.Add(""); 

CodeFix后:

var sampleList= new List<string>(){"", ""}; 

但我坚持这个问题,一旦我得到LocalDeclarationStatement一个节点,我不知道,如果存在一个从父节点获取下一个相邻节点的方法。

Syntax Tree

在上面的图片我需要两个ExpressionStatement分析LocalDeclarationStatement

要求为了分析

  1. 识别LocalDeclarationStatement,一个已经初始化的集合之后,但犯规包含CollectionInitializerExpression
  2. 查找下一行是否有表达式声明是usin摹Add方法在同一采集

需要量为代码修复

  1. 对于使用Add方法对收集
  2. Add方法的所有其他间断的使用相邻的表达式语句提供集合初始化语法在收集上必须避免。

回答

3

你可以这样做:

var declarationStatement = ...; 
var block = (BlockSyntax)declarationStatement.Parent; 
var index = block.Statements.IndexOf(declarationStatement); 
var nextStatement = block.Statements[index + 1]; 
+0

这工作完全正常!我真的很感激。 – 2014-10-21 05:08:44

+0

我们如何删除使用相同的CodeFix提供程序替换为集合初始值设定项语法的附加代码行(相邻的'Add'调用)。我能够为集合初始化器提供修复,但无法删除其他连续的“添加”调用行。 – 2014-10-21 12:35:11

+0

@JerricLynsJohn你尝试过'RemoveNode'扩展方法吗? – svick 2014-10-21 15:15:54

1

难道你只是需要把混凝土块变成列表,并检查?

var nodes = yourSyntaxTree.DescentNodes().ToList(); 

for(var i = 0; i < nodes.Count; i++){ 
    var localDeclarationStatement = nodes[i] as LocalDeclarationStatement; 
    if(localDeclarationStatement==null && i + 1 >= nodes.Length) 
     continue; 

    var expressionStatement = nodes[i+1] as ExpressionStatement; 
    if(expressionStatement==null) 
    continue; 

    // there you have it. 
}