Roslyn CodeFixProvider 中一致的行结尾

Consistent line endings in a Roslyn CodeFixProvider

我目前正在使用 Visual Studio 2015 年提供的 Roslyn SDK 开发 CodeFixProvider。提供程序的目标是为 throw 语句添加缺少的 <exception> 文档。

我正在构建这样的语法:

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);

问题
这确实添加了缺少的 文档注释,但遗憾的是使用了错误的行尾。我可以将硬编码的 \n 更改为 Environment.NewLine 但这仍然可能与文件的行结尾不匹配。

有没有办法使用应用修复程序的文档的行结尾?

您可以像这样检测使用了哪个换行符

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