我正在尝试使用CSharpSyntaxRewriter进行重写,无论何时出现,都会改变
YIELD(variable);
成
foreach (var item in variable)
{
yield return item;
}
但它改变了
public static string Upper(string s)
{
YIELD(variable);
}
进入这个
public static string Upper(string s)
{
foreach (var item in variable)
{
yield return item;
}
}
这是我的一些
if (@"YIELD".Equals(expression_name.Identifier.ValueText, StringComparison.Ordinal))
{
var argumentName = (ArgumentSyntax)expression.Parent.ChildNodes().OfType<ArgumentListSyntax>().FirstOrDefault()?.ChildNodes().FirstOrDefault();
var myExpression = SyntaxFactory.ForEachStatement(
SyntaxFactory.IdentifierName("var"),
"item",
argumentName.Expression,
SyntaxFactory.Block(
SyntaxFactory.YieldStatement(
SyntaxKind.YieldReturnStatement,
SyntaxFactory.IdentifierName("item")))
).NormalizeWhitespace().WithLeadingTrivia(leadingTrivia);
node = node.ReplaceNode(
expressionStatment,
Enumerable.Repeat(myExpression.WithTrailingTrivia(SyntaxFactory.EndOfLine(Environment.NewLine)), 1));
}
我试图在myExpression中添加Leading Trivia到Block,但它没有用。
foreach语句没有缩进的原因是因为你在错误的地方调用NormalizeWhitespace。当您在单个音符上调用它时,您将在没有剩余语法树的上下文的情况下格式化所述音符,因此基本上您只是格式化以下内容然后将其粘贴到现有代码中:
foreach (var item in variable)
{
yield return item;
}
但是,如果您在语法树的根目录上执行.NormalizeWhitespace()(当然在修改它之后),则格式化整个树,这将导致格式正确。