Roslyn CodeFixProvider中的一致行尾

3

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

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

有没有一种方法可以使用应用修复的文档的行尾?


有没有办法使用应用修复的文档的行结尾?如果文件混合了两种类型怎么办? - ta.speot.is
@ta.speot.is 这是一个好问题,我不知道。在这种情况下,Visual Studio提供的默认修复如何处理行尾? - Wazner
1个回答

2
您可以通过以下方式检测使用的换行符:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接