我是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();
...
}
为此,我需要在代表BlockSyntax
块的ForEachStatementSyntax
内的foreach
开头插入一条语句。这是我的代码:
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.Format
或SyntaxNode.NormalizeWhitespace
。
我无法使用Formatter.Format
,因为它需要Workspace
个参数,看起来我无法访问Workspace
每NormalizeWhitespace()
3}}
我尝试在文档的语法根目录上使用ForEachStatementSyntax
,但是有条理地格式化了与修复程序无关的其他代码。我尝试仅在与foreach
块关联的syntaxRoot = syntaxRoot.ReplaceNode(oldForEach, newForEach)
上使用它,然后调用foreach
,但这会导致整个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();
} }
}
}
块不正确缩进。
babel-node index.js
那么首先可以简单地插入带有正确缩进的语句,而不必格式化其他代码吗?
感谢。
答案 0 :(得分:2)
您可以使用Formatter Annotation
将WithAdditionalAnnotations添加到您希望格式化程序运行的节点上 blockStatement.Statements.Insert(0, selectorStatement.WithAdditionalAnnotations(Formatter.Annotation))