2014-10-20 2 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. Обеспечение синтаксиса инициализатора Collection для смежных утверждений выражений, которые используют Add метод на коллекции
  2. Все другие intermitten использования метода Add по сборке следует избегать.

ответ

3

Вы можете сделать что-то вроде:

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

Это отлично работает! Я действительно ценю это. –

+0

Как удалить дополнительные строки кода (смежные 'Add' invocations), которые были заменены синтаксисом Collection Initializer с использованием того же провайдера CodeFix. Я смог предоставить исправление для инициализатора коллекции, но не смог удалить другие последовательные строки 'Add' invocation. –

+0

@JerricLynsJohn Пробовал ли метод расширения «RemoveNode»? – svick

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. 
} 
Смежные вопросы