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

Posted

技术标签:

【中文标题】使用 Roslyn 生成格式良好的语法【英文标题】:Generating well-formatted syntax with Roslyn 【发布时间】:2016-02-01 17:26:52 【问题描述】:

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

【问题讨论】:

【参考方案1】:

是的 - 有可能,使用 Microsoft.CodeAnalysis.Formatting.Formatter:

var formattedResult = Formatter.Format(syntaxNode, workspace);

【讨论】:

【参考方案2】:

您可以在 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;

【讨论】:

以上是关于使用 Roslyn 生成格式良好的语法的主要内容,如果未能解决你的问题,请参考以下文章

是否有生成格式良好的表单的标准?

Roslyn 如何使用 MSBuild Copy 复制文件

org-mode,如何使用格式良好的组织链接自动生成漂亮的文件层次结构树

Roslyn 语法树中的各种语法节点及每个节点的含义

使用 Roslyn 生成 getter 和 setter lambda

在线数据库表(sql语句)生成java实体类工具 - 参考手册