重写C#Roslyn后格式化代码

问题描述 投票:1回答:1

我正在尝试使用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,但它没有用。

c# roslyn
1个回答
1
投票

foreach语句没有缩进的原因是因为你在错误的地方调用NormalizeWhitespace。当您在单个音符上调用它时,您将在没有剩余语法树的上下文的情况下格式化所述音符,因此基本上您只是格式化以下内容然后将其粘贴到现有代码中:

foreach (var item in variable)
{
    yield return item;
}

但是,如果您在语法树的根目录上执行.NormalizeWhitespace()(当然在修改它之后),则格式化整个树,这将导致格式正确。

© www.soinside.com 2019 - 2024. All rights reserved.