Удалить комментарии, включая строку, в которой они находятся? - PullRequest
1 голос
/ 21 января 2020

Я работаю над быстрым исправлением, чтобы удалить комментарии из определенных элементов синтаксического дерева - оно дает ожидаемые результаты почти в каждом случае.

Однако я не могу найти способ удалить комментарии, включая их начальные и конечные мелочи.

Ни так, ни так:

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,
};
...