Как добавить комментарий в конце строки, используя Roslyn - PullRequest
1 голос
/ 28 сентября 2019

Я хочу добавить комментарий в конец строки, используя Roslyn.

Потенциально, я хочу добавить комментарий к нескольким строкам в одной и той же операции, поэтому я хотел бы работать с DocumentEditor или с SyntaxRewriter (CSharpSyntaxRewriter или VisualBasicSyntaxRewriter).

Использование DocumentEditor Я могу найти EndOfLineTrivia, где я хочу вставить комментарий, но я не знаю, как вставить SingleLineCommentTrivia перед ним.

Есть ли способ вставить SingleLineCommentTrivia с помощью DocumentEditor?

Используя SyntaxRewriter , я могупереопределите метод VisitTrivia и найдите EndOfLineTrivia, куда я хочу вставить комментарий.Я могу заменить EndOfLineTrivia на SingleLineCommentTrivia, но тогда разрыв строки будет потерян.

Есть ли способ заменить EndOfLineTrivia последовательностью SingleLineCommentTrivia и EndOfLineTrivia с использованием SyntaxRewriter?

Если ни то, ни другоеиз этих методов возможно, что было бы лучшим способом вставить комментарий в конце строки?

1 Ответ

2 голосов
/ 28 сентября 2019

Я думаю, что я нашел ответы для обоих случаев:


Используя 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 ) ;
  }
}  
...