如何使用 Roslyn 添加行尾注释



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

可能,我想在同一操作中为多行添加注释,因此我想使用DocumentEditor或SyntaxRewriter(CSharpSyntaxRewriter或VisualBasicSyntaxRewriter(。

使用DocumentEditor,我能够找到EndOfLineTrivia,我想在其中插入注释,但我不知道如何在它之前插入SingleLineCommentTrivia。

有没有办法使用DocumentEditor插入SingleLineCommentTrivia?

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

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

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

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


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

但是,所有琐事都与语法节点相关联。你要做的是找到那个语法节点,用修改后的琐事创建一个副本,然后替换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。

在不显示如何选择要修改的行的详细信息的情况下,这是近似逻辑:

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

最新更新