在'之前删除换行符:'添加继承时

时间:2016-08-10 11:20:32

标签: c# roslyn

使用这样的输入:

namespace Test
{
    using System;

    public class Test
    {
        public int? OBJECTID { get; set; }
    }
}

我想让这个类扩展其他类。所以我用这些规则写了我的改写者:

public override SyntaxNode VisitClassDeclaration(ClassDeclarationSyntax node)
{
    node =
        node.WithBaseList(
            SyntaxFactory.BaseList()
                .WithTypes(
                    SyntaxFactory.SingletonSeparatedList<BaseTypeSyntax>(
                        SyntaxFactory.SimpleBaseType(SyntaxFactory.ParseName("Form"))
                            .WithLeadingTrivia(SyntaxFactory.Space) //Space before 'Form'
                            .WithTrailingTrivia(SyntaxFactory.LineFeed) // NewLine after 'Form'
                        )
                )
            );

    return base.VisitClassDeclaration(node);
}

但我得到的输出看起来像这样:

namespace Test
{
    using System;

    public class Test
: Form
    {
        public int? OBJECTID { get; set; }
    }
}

我在许多不同的位置尝试了WithoutTrailingTrivia()WithoutLeadingTrivia(),但我无法找到真正放置它的位置,以便在":"之前移除换行符。

你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:4)

我使用扩展性工具中的语法Visualizer,在类名后面放置了插入符号,从示例中查看了语法树。这为我提供了以下语法树:

enter image description here

如您所见,EndOfLineTrivia与IdentifierToken相关联。因此,您可以通过替换标识符来删除它(或替换它,如下例所示):

    public override SyntaxNode VisitClassDeclaration(ClassDeclarationSyntax node)
    {
        node = node.WithBaseList(
            SyntaxFactory.BaseList()
                .WithTypes(
                   SyntaxFactory.SingletonSeparatedList<BaseTypeSyntax>(
                       SyntaxFactory.SimpleBaseType(SyntaxFactory.ParseName("Form"))
                           .WithLeadingTrivia(SyntaxFactory.Space) 
                           .WithTrailingTrivia(SyntaxFactory.LineFeed)
                    )
                )
            );
        node =
            node.WithIdentifier(
                node.Identifier.WithTrailingTrivia
                    (SyntaxFactory.SyntaxTrivia(SyntaxKind.WhitespaceTrivia, " ")));
        return base.VisitClassDeclaration(node);
    }