Roslyn - SyntaxNode "исчезает", если добавлены завершающие мелочи - PullRequest
0 голосов
/ 14 февраля 2019

Я работаю над небольшим кусочком кода roslyn, чтобы попытаться выполнить несколько простых рефакторингов внутри проекта расширения Visual Studio для MAC.

Я хочу реорганизовать этот код:

public class Test
{
    private const object a = null; 


    public const int c = 0;

}

в этот код

public class Test
{
    public const int c = 0;
    private const object a = null; 

}

До сих пор мне удавалось получить список ISymbol, представляющий мои константы, правильно упорядочить их, а затем преобразовать их в список SyntaxNode, подобный этому

var orderedMembers = orderer.OrderAll(classMembers);
var nodes = orderedMembers.Select(o => o.DeclaringSyntaxReferences.FirstOrDefault().GetSyntax())
                                  .Where(node => node != null)
                                  .ToList();

Пока все хорошо.Вывод будет таким:

public class Test
{
    public const int c = 0;
    private const object a = null; 
}

Теперь мой последний шаг - добавление нескольких строк после моей последней константы, чтобы определить разделение между моими константами и тем, что может последовать.

Кажется, яможно сделать это, добавив в конце мой Синтаксический узел пустые следы / ведущие.Итак, я попробовал это (жестко запрограммировано для простоты прямо сейчас):

nodes[1] = nodes[1].WithTrailingTrivia(SyntaxFactory.CarriageReturnLineFeed);

Затем я вставляю свои новые узлы в мой узел объявления класса «Test» и превращаю его в строку (здесь «editor» являетсяэкземпляр Microsoft.CodeAnalysis.Editing.DocumentEditor, представляющий файл, который я открыл с vs для mac IDE):

editor.InsertMembers(classNode, 0, nodes);
var newDocument = editor.GetChangedDocument();
(await newDocument.GetTextAsync()).ToString();

, и это то, что он генерирует:

public class Test
{
    public const int c = 0;
}

Итак, синтаксический узелЯ пытался добавить викторины в, не генерируется при вызове GetTextAsync в моем недавно отредактированном документе.

Я впервые играю с Roslyn, поэтому я предполагаю, что упустил что-то важное об использованииМелочи, но я не могу найти, что это такое.Любые идеи о том, как добавить несколько новых строк после определенного синтаксического узла?

...