【问题标题】:How to add a trailing end of line to AttribueList using Roslyn CTP如何使用 Roslyn CTP 将行尾添加到 AttribueList
【发布时间】:2013-06-13 20:14:45
【问题描述】:

我正在尝试使用 Roslyn CTP 语法生成带有 [DataContractAttribute] 的一些属性。不幸的是,Roslyn 将属性与属性放在同一行。

这是我得到的:

[DataContract]public int Id { get; set; }
[DataContract]public int? Age { get; set; }

我想要达到的目标:

[DataContract]
public int Id { get; set; }
[DataContract]
public int? Age { get; set; }

生成器代码:

string propertyType = GetPropertyType();
string propertyName = GetPropertyName();
var property = Syntax
    .PropertyDeclaration(Syntax.ParseTypeName(propertyType), propertyName)
    .WithModifiers(Syntax.TokenList(Syntax.Token(SyntaxKind.PublicKeyword)))
    .WithAttributeLists(
        Syntax.AttributeList(
            Syntax.SeparatedList<AttributeSyntax>(
                Syntax.Attribute(Syntax.ParseName("DataContract")))))
    .WithAccessorList(
        Syntax.AccessorList(
            Syntax.List(
                Syntax.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration)
                    .WithSemicolonToken(Syntax.Token(SyntaxKind.SemicolonToken)),
                Syntax.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration)
                    .WithSemicolonToken(Syntax.Token(SyntaxKind.SemicolonToken))
        )));

在将这些属性包装在一个类、一个命名空间和最后一个 CompilationUnit 中之后,我使用以下代码来获取字符串结果:

var compUnit = Syntax.CompilationUnit().WithMembers(...);
IFormattingResult fResult = compUnit.Format(new FormattingOptions(false, 4, 4));
string result = fResult.GetFormattedRoot().GetText().ToString();

【问题讨论】:

  • 如何将结果转换为string
  • @svick 我用如何检索字符串结果更新了我的问题
  • 我认为最干净(但可能不是最简单)的解决方案是实现 IFormattingRule 并在您的 Format() 调用中使用它。但我不知道如何正确实施。
  • 格式化规则在这里是多余的。只需使用换行符生成您的原始节点。格式化程序应该保留它。
  • @JasonMalinowski 我尝试将 TrailingTrivia(Syntax.EndOfLine) 添加到 AttributeList、Attribute 等 - 没有效果。

标签: c# .net code-generation roslyn


【解决方案1】:

执行此操作的一种方法是格式化您的代码,然后通过将尾随琐事添加到所有属性属性列表来修改它。比如:

var formattedUnit = (SyntaxNode)compUnit.Format(
    new FormattingOptions(false, 4, 4)).GetFormattedRoot();

formattedUnit = formattedUnit.ReplaceNodes(
    formattedUnit.DescendantNodes()
                 .OfType<PropertyDeclarationSyntax>()
                 .SelectMany(p => p.AttributeLists),
    (_, node) => node.WithTrailingTrivia(Syntax.Whitespace("\n")));

string result = formattedUnit.GetText().ToString();

【讨论】:

  • 它可以工作并且属性在新行上,但不幸的是它们丢失了缩进。但是,我可以通过在“\n”之后附加所需的缩进来添加这些,所以我有我想要的。谢谢
【解决方案2】:

像下面这样使用它:

.WithTrailingTrivia(SyntaxFactory.ElasticCarriageReturnLineFeed)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多