Roslyn CodeFixProvider中的一致行结尾

时间:2015-12-12 20:39:10

标签: c# .net newline roslyn

我目前正在使用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);

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

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

1 个答案:

答案 0 :(得分:1)

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

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