如何使用 Roslyn 添加行尾注释

How can I add an end-of-line comment using Roslyn

我想使用 Roslyn 在行尾添加注释。

可能,我想在同一操作中向多行添加注释,所以我想使用 DocumentEditorSyntaxRewriter(CSharpSyntaxRewriter 或 VisualBasicSyntaxRewriter)。

使用 DocumentEditor 我可以找到要插入评论的 EndOfLineTrivia,但我不知道如何在它之前插入 SingleLineCommentTrivia。

有什么方法可以使用 DocumentEditor 插入 SingleLineCommentTrivia 吗?

使用 SyntaxRewriter,我可以覆盖 VisitTrivia 方法并找到要插入评论的 EndOfLineTrivia。我可以用 SingleLineCommentTrivia 替换 EndOfLineTrivia,但是换行符丢失了。

有什么方法可以使用 SyntaxRewriter 将 EndOfLineTrivia 替换为一系列 SingleLineCommentTrivia 和 EndOfLineTrivia?

如果这两种方法都不可行,插入行尾注释的更好方法是什么?

我想我已经找到了两种情况的答案:


使用 DocumentEditor 您可以替换 SyntaxNode,但不能替换 SyntaxTrivia。

然而,所有琐事都与 SyntaxNode 相关联。您要做的是找到该 SyntaxNode,使用修改后的琐事创建它的副本,然后替换 SytnaxNode。

使用 SyntaxNode.WithTrailingTrivia(),您可以用一个 或更多 SyntaxTrivia 对象替换现有的尾随琐事。

不深入每个细节,代码大致是:

SyntaxNode        OldNode ;
DocumentEditor    RoslynEditor ;

// Initialize OldNode and RoslynEditor ...   

var st      = SyntaxFactory.Comment ( "   // my comment" ) ;
var NewNode = p.WithTrailingTrivia ( st, SyntaxFactory.CarriageReturnLineFeed ) ;

RoslynEditor.ReplaceNode ( p, NewNode ) ;

// and later ...

Dim newRoot = RoslynEditor.GetChangedRoot() ;

注意:这假设应该插入注释的行尾是 SyntaxNode 的尾部琐事,它将被替换。如果没有,则将插入一个新的换行符。


使用 SyntaxRewriter,诀窍是使用 SyntaxFactory.EndOfLine,生成包含行尾注释和实际行尾的 SyntaxToken。

没有显示如何select修改哪一行的细节,这是大概的逻辑:

class MLHideRewriterCS : CSharpSyntaxRewriter
{
  ...

  public override SyntaxTrivia VisitTrivia ( SyntaxTrivia trivia )
  {
    // Some logic to detect the correct line ...
    if ( this is the line that we want to modify )
    {
      var expression = SyntaxFactory.EndOfLine ( "    // my comment" ) ;
      return expression ;
    }

    return base.VisitTrivia ( trivia ) ;
  }
}