【问题标题】:How does one get Roslyn to format XML Documentation Comments properly?如何让 Roslyn 正确格式化 XML 文档注释?
【发布时间】:2013-04-03 00:46:25
【问题描述】:

我正在使用SyntaxRewriter 将类从旧库转换为新库,这基本上需要查找具有给定属性的类,然后重写遵循特定约定的属性。重写器的大致骨架如下:

class PropertyConverter : SyntaxRewriter
{
    public override SyntaxNode VisitPropertyDeclaration(PropertyDeclarationSyntax node)
    {
        if (!MeetsUpdateCriteria(node)) return base.VisitPropertyDeclaration(node);

        // these implementations simply return a string
        var name = FigureOutName(node.Identifier);
        var propertyType = FigureOutType(node.Type);

        var getter = Syntax.ParseExpression("this.GetValue<" + propertyType + ">(" + name + ")");
        var setter = Syntax.ParseExpression("this.SetValue(" + name + ", value)");

        return node.WithType(propertyType)
                   .WithAccessorList(
            Syntax.AccessorList(Syntax.List(
                Syntax.AccessorDeclaration(
                    SyntaxKind.GetAccessorDeclaration,
                    Syntax.Block(Syntax.ReturnStatement(getter))),
                Syntax.AccessorDeclaration(
                    SyntaxKind.SetAccessorDeclaration,
                    Syntax.Block(Syntax.ExpressionStatement(setter)))))));
    }
}

这个转换器的结果是一个属性更新的类,输出如下代码:

// IDocument csfile <- from a project in a Workspace
var tree = csfile.GetSyntaxTree();
var root = new PropertyConverter().Visit((SyntaxNode)tree.GetRoot())
                                  .NormalizeWhitespace(); // problem!

File.WriteAllText(Path.GetFileName(csfile.FilePath), root.ToFullString());    

此时代码在语法上都是正确的,输出的语法树也是正确的。我唯一的抱怨是 XML 文档注释周围的空格根本不正确:

/// <summary>
        /// Gets or sets the thickness (TH).
        /// </summary>
public float Thickness
{
    get
    {
        return this.GetValue<float>(TH);
    }

    set
    {
        this.SetValue(TH, value);
    }
}

注意所有多余的缩进。此外,间距在其他方面也被破坏了,尤其是在方法文档中:

/// <summary>
        /// Initializes a new instance of the <see cref = "X"/> class.
        /// </summary>
        /// <param name = "innerRadius">Inner radius of the X.</param>
        /// <param name = "thickness">Thickness of the X.</param>

在调用NormalizeWhitespace 之前,我已经验证了输入树没有出现这些缩进问题,并且我还验证了该树没有出现这些缩进问题。我也试过elasticTrivia: true,也没有任何运气。

那么如何让 Roslyn 以一致的方式规范化空白?

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    我认为这可能是 Roslyn 中的一个错误。但是,一般来说,我建议在包含在 Roslyn.Services.dll 中的 SyntaxNode 上使用 Format 扩展方法(添加 using Roslyn.Services;)。

    NormalizeWhitespace 是一个非常强力的系统,主要用于确保代码往返。 Roslyn.Services 层中存在的格式化代码更灵活一些,并结合了 Visual Studio Format Document 命令的许多行为。

    【讨论】:

    • 输出仍然不太正确,但比NormalizeWhitespace更接近我的预期。
    • 你能告诉我有什么不同吗?这可能只是一个错误。
    • 如果不存在成员和 XML 文档之间不添加换行符,并且如果两个成员声明在调用之前没有用换行符分隔,那么它们之后也不存在。
    猜你喜欢
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2011-02-20
    • 2011-08-25
    • 2010-11-01
    相关资源
    最近更新 更多