Я работаю над быстрым исправлением, чтобы удалить комментарии из определенных элементов синтаксического дерева - оно дает ожидаемые результаты почти в каждом случае.
Однако я не могу найти способ удалить комментарии, включая их начальные и конечные мелочи.
Ни так, ни так:
var comments = syntaxRoot.DescendantTrivia().Where(trivia => trivia.IsKind(SyntaxKind.SingleLineCommentTrivia) || trivia.IsKind(SyntaxKind.MultiLineCommentTrivia));
var replaced = syntaxRoot
.ReplaceTrivia(comments, (b, a) => SyntaxFactory.ElasticMarker);
return document.WithSyntaxRoot(replaced);
, ни так:
internal class CommentRemovalRewriter : CSharpSyntaxRewriter
{
/// <inheritdoc />
public CommentRemovalRewriter(bool visitIntoStructuredTrivia = false) : base(visitIntoStructuredTrivia)
{
}
/// <inheritdoc />
public CommentRemovalRewriter(SyntaxTrivia replacementTrivia, bool visitIntoStructuredTrivia = false) : base(visitIntoStructuredTrivia)
{
ReplacementTrivia = replacementTrivia;
}
public SyntaxTrivia ReplacementTrivia { get; set; } = SyntaxFactory.ElasticMarker;
/// <inheritdoc />
public override SyntaxTrivia VisitTrivia(SyntaxTrivia trivia)
{
if(trivia.IsKind(SyntaxKind.MultiLineCommentTrivia) || trivia.IsKind(SyntaxKind.SingleLineCommentTrivia))
return ReplacementTrivia;
return base.VisitTrivia(trivia);
}
}
работает так, как я хочу, с объявлениями массивов (обратите внимание, что он отлично работает с методами, удаляя комментарии, а также начальные / конечные мелочи.
var bla = new[]
{
// comment
1,
// comment
2,
// comment
3,
};
в этот
var bla = new[]
{
1,
2,
3,
};
вместо этого
var bla = new[]
{
1,
2,
3,
};