2015-12-12 3 views
1

В настоящее время я работаю над CodeFixProvider с использованием Roslyn SDK, представленного в Visual Studio 2015. Целью провайдера является добавление отсутствующей документации для инструкций throw для <exception>.Согласование окончаний строк в Roslyn CodeFixProvider

Я строю синтаксис вроде этого:

var newNodes = new XmlNodeSyntax[] 
{ 
    SyntaxFactory.XmlText(
     SyntaxFactory.TokenList(
      SyntaxFactory.XmlTextLiteral(
       SyntaxFactory.TriviaList(SyntaxFactory.DocumentationCommentExterior("///")), 
       string.Empty, 
       string.Empty, 
       SyntaxFactory.TriviaList() 
      ), 
      SyntaxFactory.XmlTextNewLine(SyntaxFactory.TriviaList(), "\n", "\n", SyntaxFactory.TriviaList()), 
      SyntaxFactory.XmlTextLiteral(
       SyntaxFactory.TriviaList(SyntaxFactory.DocumentationCommentExterior("///")), 
       " ", 
       " ", 
       SyntaxFactory.TriviaList() 
      ) 
     ) 
    ), 
    SyntaxFactory.XmlElement(
     SyntaxFactory.XmlElementStartTag(SyntaxFactory.XmlName("exception")) 
      .WithAttributes(SyntaxFactory.SingletonList<XmlAttributeSyntax>(
       SyntaxFactory.XmlCrefAttribute(
        SyntaxFactory.XmlName("cref"), 
        SyntaxFactory.Token(SyntaxKind.DoubleQuoteToken), 
        SyntaxFactory.NameMemberCref(
         SyntaxFactory.IdentifierName(thrownTypeSymbol.ToMinimalDisplayString(semanticModel, throwSyntax.GetLocation().SourceSpan.Start)) 
        ), 
        SyntaxFactory.Token(SyntaxKind.DoubleQuoteToken) 
       ).WithLeadingTrivia(
        SyntaxFactory.TriviaList(
         SyntaxFactory.Whitespace(" ") 
        ) 
       ) 
      )), 
     SyntaxFactory.XmlElementEndTag(SyntaxFactory.XmlName("exception")) 
    ).WithContent(
     SyntaxFactory.List<XmlNodeSyntax>(new[] { 
      SyntaxFactory.XmlText() 
       .WithTextTokens(
        SyntaxFactory.TokenList(
         SyntaxFactory.XmlTextNewLine(SyntaxFactory.TriviaList(), "\n", "\n", SyntaxFactory.TriviaList()), 
         SyntaxFactory.XmlTextLiteral(
          SyntaxFactory.TriviaList(SyntaxFactory.DocumentationCommentExterior("///")), 
          " ", 
          " ", 
          SyntaxFactory.TriviaList() 
         ), 
         SyntaxFactory.XmlTextNewLine(SyntaxFactory.TriviaList(), "\n", "\n", SyntaxFactory.TriviaList()), 
         SyntaxFactory.XmlTextLiteral(
          SyntaxFactory.TriviaList(SyntaxFactory.DocumentationCommentExterior("///")), 
          " ", 
          " ", 
          SyntaxFactory.TriviaList() 
         ) 
        ) 
       ) 
     }) 
    ), 
    SyntaxFactory.XmlText(
     SyntaxFactory.TokenList( 
      SyntaxFactory.XmlTextNewLine(
       SyntaxFactory.TriviaList(), 
       Environment.NewLine, 
       Environment.NewLine, 
       SyntaxFactory.TriviaList() 
      ) 
     ) 
    ) 
}; 

А потом добавление узлов к существующему DocumentationCommentTriviaSyntax узла.

newTrivia = xmlTrivia.AddContent(newNodes); 

Проблема
Это добавить недостающие < исключение> документация комментарии, но, к сожалению, используя неправильные окончания строки. Я могу изменить hardcoded \n на Environment.NewLine, но это все еще может не совпадать с окончанием строки файла.

Есть ли способ использовать окончание строки документа, в которое применяется исправление?

+0

'Есть ли способ использовать окончаний строк документа исправление применяется в?' Что делать, если файл имеет сочетание обоих? –

+0

@ ta.speot.is Это хороший вопрос, я не знаю. Как исправления по умолчанию, предоставленные Visual Studio для обработки строк в этом случае? – Wazner

ответ

1

Вы можете определить, какой LineBreak используется как этот

private SyntaxTrivia _detectLineBreakTrivia(SyntaxNode root) 
    { 
     var result = root.DescendantTokens() 
         .SelectMany(token => token.TrailingTrivia) 
         .FirstOrDefault(trivia => trivia.IsKind(SyntaxKind.EndOfLineTrivia)); 
     if(Equals(result, default(SyntaxTrivia)) 
      resut = SyntaxFactory.CarriageReturnLineFeed; 
     return result; 
    } 
Смежные вопросы