Я думаю, что я нашел ответы для обоих случаев:
Используя 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() ;
Примечание. Предполагается, что конец-f-line, где комментарий должен быть вставлен, является в конце мелочи 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 ) ;
}
}