如何使用 Roslyn 将语句插入具有规范化空白的块中?
How do I insert a statement into a block with normalized whitespace using Roslyn?
我是罗斯林的新手。我正在编写一个代码修复提供程序来转换 foreach
块,这些块迭代 Select
的结果,例如
foreach (var item in new int[0].Select(i => i.ToString()))
{
...
}
至
foreach (int i in new int[0])
{
var item = i.ToString();
...
}
为此,我需要在代表 foreach
块的 ForEachStatementSyntax
内的 BlockSyntax
开头插入一条语句。这是我的代码:
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();
...
}
我用谷歌搜索了解决方案。我遇到了 this answer,建议使用 Formatter.Format
或 SyntaxNode.NormalizeWhitespace
。
我不能使用 Formatter.Format
因为它需要一个 Workspace
参数,看起来我无法访问每个 [=] 的 Workspace
31=].
我尝试在文档的语法根目录上使用 NormalizeWhitespace()
,但是这侵入性地格式化了与修复无关的其他代码。我尝试仅在与 foreach
块关联的 ForEachStatementSyntax
上使用它,然后调用 syntaxRoot = syntaxRoot.ReplaceNode(oldForEach, newForEach)
,但这导致整个 foreach
块 not 正确缩进。
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 to the nodes that you want the formatter to run on using WithAdditionalAnnotations
blockStatement.Statements.Insert(0, selectorStatement.WithAdditionalAnnotations(Formatter.Annotation))
我是罗斯林的新手。我正在编写一个代码修复提供程序来转换 foreach
块,这些块迭代 Select
的结果,例如
foreach (var item in new int[0].Select(i => i.ToString()))
{
...
}
至
foreach (int i in new int[0])
{
var item = i.ToString();
...
}
为此,我需要在代表 foreach
块的 ForEachStatementSyntax
内的 BlockSyntax
开头插入一条语句。这是我的代码:
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();
...
}
我用谷歌搜索了解决方案。我遇到了 this answer,建议使用 Formatter.Format
或 SyntaxNode.NormalizeWhitespace
。
我不能使用
Formatter.Format
因为它需要一个Workspace
参数,看起来我无法访问每个 [=] 的Workspace
31=].我尝试在文档的语法根目录上使用
NormalizeWhitespace()
,但是这侵入性地格式化了与修复无关的其他代码。我尝试仅在与foreach
块关联的ForEachStatementSyntax
上使用它,然后调用syntaxRoot = syntaxRoot.ReplaceNode(oldForEach, newForEach)
,但这导致整个foreach
块 not 正确缩进。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 to the nodes that you want the formatter to run on using WithAdditionalAnnotations
blockStatement.Statements.Insert(0, selectorStatement.WithAdditionalAnnotations(Formatter.Annotation))