gpt4 book ai didi

c# - 如何使用 Roslyn 将语句插入具有规范化空白的 block 中?

转载 作者:行者123 更新时间:2023-11-30 23:15:30 25 4
gpt4 key购买 nike

我是 Roslyn 的新手。我正在编写一个代码修复提供程序,它转换 foreach block ,该 block 迭代 Select 的结果,例如

foreach (var item in new int[0].Select(i => i.ToString()))
{
...
}

foreach (int i in new int[0])
{
var item = i.ToString();
...
}

为此,我需要在 ForEachStatementSyntax 内的 BlockSyntax 开头插入一条语句,代表 foreach block 。这是我的代码:

var blockStatement = forEach.Statement as BlockSyntax;
if (blockStatement == null)
{
return document;
}
forEach = forEach.WithStatement(
blockStatment.WithStatements(
blockStatement.Statements.Insert(0, selectorStatement));

不幸的是,这样做会导致空白被关闭:

            foreach (int i in new int[0])
{
var item = i.ToString();
...
}

我用 Google 搜索了解决方案。我遇到了this answer ,建议使用 Formatter.FormatSyntaxNode.NormalizeWhitespace

  • 我不能使用 Formatter.Format,因为它需要一个 Workspace 参数,看起来我无权访问 Workspace Roslyn: Current Workspace in Diagnostic with code fix project .

  • 我尝试在文档的语法根上使用 NormalizeWhitespace(),但它侵入性地格式化了与修复无关的其他代码。我尝试仅在与 foreach block 关联的 ForEachStatementSyntax 上使用它,然后调用 syntaxRoot = syntaxRoot.ReplaceNode(oldForEach, newForEach),但是这导致整个 foreach block 没有被正确缩进。

    namespace ConsoleApp1
    {
    class Program
    {
    static void Main(string[] args)
    {
    var array = new int[0];
    int length = array.Length;

    foreach (int i in array)
    {
    string item = i.ToString();
    } }
    }
    }

那么是否可以简单地首先插入带有正确缩进的语句,而无需格式化其他代码?

谢谢。

最佳答案

您可以添加 Formatter Annotation使用 WithAdditionalAnnotations 到您希望格式化程序运行的节点

blockStatement.Statements.Insert(0, selectorStatement.WithAdditionalAnnotations(Formatter.Annotation))

关于c# - 如何使用 Roslyn 将语句插入具有规范化空白的 block 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42521036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com