无法专门遍历语法树?

时间:2014-10-20 15:47:24

标签: visual-studio-2013 roslyn vsix

我正在尝试为Collection初始化程序及其相应的Code Fix提供程序实现Diagnostic Analyzer。

错误的代码:

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

CodeFix之后:

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

但我一直坚持这个问题,一旦我获得了LocalDeclarationStatement的节点,我就不知道是否有办法从父节点获取下一个相邻节点。

Syntax Tree

在上面的图片中,我在分析LocalDeclarationStatement

后需要两个ExpressionStatement

分析仪的要求

  1. 标识LocalDeclarationStatement,一个已初始化但不包含CollectionInitializerExpression
  2. 的集合
  3. 查找下一行是否具有在同一集合中使用Add方法的Expression语句
  4. 代码修复的要求

    1. 为集合
    2. 上使用Add方法的相邻Expression语句提供集合初始值设定项语法
    3. 必须避免对集合中所有其他间歇性使用Add方法。

2 个答案:

答案 0 :(得分:3)

您可以执行以下操作:

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

答案 1 :(得分: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.
}