2016-08-10 1 views
2

Mit gegebener Eingabe wie folgt ergänzt:Newline Entfernen vor ‚:‘ wenn Vererbung

namespace Test 
{ 
    using System; 

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

würde Ich mag diese Klasse machen andere Klassen erweitern. Also schrieb ich meine rewriter mit diesen Regeln:

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); 
} 

Aber der Ausgang ich wie folgt aussieht:

namespace Test 
{ 
    using System; 

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

I WithoutTrailingTrivia() und WithoutLeadingTrivia() in vielen verschiedenen Orten versucht, aber ich konnte nicht die reale finden Ort, um es einzufügen, Newline vor ":" zu entfernen.

Können Sie mir bei diesem Problem helfen?

Antwort

4

Ich habe mir den Syntaxbaum aus dem Beispiel mit dem Syntax Visualizer aus den Extensibility Tools mit dem Caret direkt hinter dem Klassennamen angesehen. Dies gab mir folgenden Syntaxbaum:

enter image description here

Wie Sie die EndOfLineTrivia sehen kann, ist mit dem IdentifierToken verbunden. Daher können Sie es entfernen (oder ersetzen Sie es wie im folgenden Beispiel gezeigt), indem Sie den Bezeichner ersetzen:

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. Es ist manchmal nicht sehr intuitiv, zu welchem ​​Token die Trivia gehört, aber wenn man ein wenig mit Roslyn arbeitet, ist das irgendwie offensichtlich. Immerhin war der Newline schon da, sie haben nur einen neuen hinzugefügt und jetzt sind sie überrascht, dass es zwei gibt :-) – Joey

+0

Ich habe solche Tools nicht benutzt, und es ist schwieriger mit regulären Debugging-Tools zu finden. 'Identifier' hat keine' WithoutTrailingTrivia() 'und' WithoutLeadingTrivia() 'Methoden, so dass mich das auch abschreckt. – Wish

Verwandte Themen