Создание хорошо отформатированного синтаксиса с помощью Roslyn

Я использую Roslyn для изменения синтаксиса файлов C #. Используя CSharpSyntaxRewriter, очень легко найти и заменить узлы в синтаксическом дереве. Однако сгенерированный код очень уродлив и даже не будет анализироваться во всех случаях, потому что в узлах синтаксиса, которые я создаю (с использованием SyntaxFactory), отсутствует даже минимальное количество пустяков. Предоставляет ли Roslyn некоторые базовые функции форматирования, чтобы избежать этого, или мне нужно вручную добавлять мелочи к каждому создаваемому мной узлу?


person ChaseMedallion    schedule 01.11.2015    source источник


Ответы (2)


Да, это возможно, используя Microsoft.CodeAnalysis.Formatting.Formatter :

var formattedResult = Formatter.Format(syntaxNode, workspace);
person pg0xC    schedule 01.11.2015

Вы можете увидеть использование различных форматеров Roslyn здесь, в исходном коде Roslyn: http://sourceroslyn.io/#Microsoft.CodeAnalysis.Workspaces/CodeActions/CodeAction.cs,267

internal static async Task<Document> CleanupDocumentAsync(
        Document document, CancellationToken cancellationToken)
{
    if (document.SupportsSyntaxTree)
    {
        document = await ImportAdder.AddImportsFromSymbolAnnotationAsync(
        document, Simplifier.AddImportsAnnotation, cancellationToken: cancellationToken).ConfigureAwait(false);

        document = await Simplifier.ReduceAsync(document, Simplifier.Annotation, cancellationToken: cancellationToken).ConfigureAwait(false);

        // format any node with explicit formatter annotation
        document = await Formatter.FormatAsync(document, Formatter.Annotation, cancellationToken: cancellationToken).ConfigureAwait(false);

        // format any elastic whitespace
        document = await Formatter.FormatAsync(document, SyntaxAnnotation.ElasticAnnotation, cancellationToken: cancellationToken).ConfigureAwait(false);

        document = await CaseCorrector.CaseCorrectAsync(document, CaseCorrector.Annotation, cancellationToken).ConfigureAwait(false);
     }

     return document;
}
person SENya    schedule 19.11.2020