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