C# 使用Roslyn生成格式良好的语法

C# 使用Roslyn生成格式良好的语法,c#,code-formatting,roslyn,C#,Code Formatting,Roslyn,我正在使用Roslyn修改C#文件的语法。使用CSharpSyntaxRewriter,很容易在语法树中查找和替换节点。但是,生成的代码非常难看,甚至不会在所有情况下都进行解析,因为我创建的语法节点(使用SyntaxFactory)甚至缺少少量的空白琐事。Roslyn是否提供了一些基本的格式化功能来避免这种情况,还是我必须手动将琐事添加到我创建的每个节点?是-可以使用: 您可以在Roslyn源代码中看到不同Roslyn格式化程序的用法: 内部静态异步任务清理同步( 文档文档,取消令牌(取消令牌

我正在使用Roslyn修改C#文件的语法。使用CSharpSyntaxRewriter,很容易在语法树中查找和替换节点。但是,生成的代码非常难看,甚至不会在所有情况下都进行解析,因为我创建的语法节点(使用SyntaxFactory)甚至缺少少量的空白琐事。Roslyn是否提供了一些基本的格式化功能来避免这种情况,还是我必须手动将琐事添加到我创建的每个节点?

是-可以使用:


您可以在Roslyn源代码中看到不同Roslyn格式化程序的用法:

内部静态异步任务清理同步(
文档文档,取消令牌(取消令牌)
{
if(document.SupportsSyntaxTree)
{
document=wait importader.AddImportsFromSymbolAnnotationAsync(
文档,Simplier.AddImportsAnotation,cancellationToken:cancellationToken).ConfigureAwait(false);
document=await Simplifier.ReduceAsync(document,Simplifier.Annotation,cancellationToken:cancellationToken).ConfigureAwait(false);
//使用显式格式化程序批注格式化任何节点
document=await Formatter.FormatAsync(document,Formatter.Annotation,cancellationToken:cancellationToken).ConfigureAwait(false);
//格式化任何弹性空白
document=await Formatter.FormatAsync(文档,SyntaxAnnotation.ElasticAnnotation,cancellationToken:cancellationToken)。ConfigureAwait(false);
document=Wait CaseCorrector.CaseCorrectAsync(文档、CaseCorrector.Annotation、cancellationToken)。ConfigureWait(false);
}
归还文件;
}
var formattedResult = Formatter.Format(syntaxNode, workspace);
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;
}