2016-08-10 60 views
2

當給定輸入:刪除之前換行「:」像這樣將繼承

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(),但我無法找到真正的放置它,在":"之前刪除換行符。

你能幫我解決這個問題嗎?

回答

4

我從示例中使用擴展性工具中的Syntax 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); 
    } 
+0

+1。有時候瑣事屬於哪個標記有時並不是很直觀,但是當與Roslyn一起工作時,這有點顯而易見。畢竟,換行符在之前,他們只是增加了一個,現在他們很驚訝,有兩個:-) – Joey

+0

我沒有使用這樣的工具,並且使用常規的調試工具很難找到它。 「標識符」沒有'WithoutTrailingTrivia()'和'WithoutLeadingTrivia()'方法,所以這也讓我失望。 – Wish