使用 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 生成格式良好的语法的主要内容,如果未能解决你的问题,请参考以下文章
org-mode,如何使用格式良好的组织链接自动生成漂亮的文件层次结构树