如何使用 Roslyn 添加行尾注释
How can I add an end-of-line comment using Roslyn
我想使用 Roslyn 在行尾添加注释。
可能,我想在同一操作中向多行添加注释,所以我想使用 DocumentEditor 或 SyntaxRewriter(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 ) ;
}
}
我想使用 Roslyn 在行尾添加注释。
可能,我想在同一操作中向多行添加注释,所以我想使用 DocumentEditor 或 SyntaxRewriter(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 ) ;
}
}