我想格式化我用roslyn修改的代码。 我正在修改方法中的代码。 我不想重新格式化整个文件。 原始格式看起来如下:
MyNamespace
{
class CodeBasicTests
{
int OperationOrder_0()
{
int a = 20;
int b = 10;
int sum = a + b;
return (int) sum;
}
}
}
格式化方法体之后,它会与边框对齐,而不是与方法签名对齐。
MyNamespace
{
class CodeBasicTests
{
int OperationOrder_0()
{
int a = 20;
int b = 10;
int c = 30; //new instruction
int sum = a + b + c;
return (int) sum;
}
}
}
我在方法访问者(CSharpSyntaxRewriter)中尝试了以下内容:
MethodDeclarationSyntax method = visited method node;
updatedMethod = method.ReplaceNode(method.Body, newBody);
updatedMethod = updatedMethod.NormalizeWhitespace().WithTriviaFrom(method);
return updatedMethod;
或仅选择方法主体
newBody = (BlockSyntax) Formatter.Format(oldBody, texts, VisualStudioSolutionHandler.workspace);
我也尝试过使用格式化程序的文本范围,但我根本无法使其工作。
我不希望/知道编写访问者向newBody中的每个元素插入一个右侧选项卡,因为我插入的语句要复杂得多,我想仅使用自动格式化功能进行更新的方法
我不知道保持原始方法缩进的热度。
答案 0 :(得分:1)
将琐事替换为当前的琐事列表,并插入新的琐事。
以下是我创建的扩展方法示例,用于向某些带注释的节点添加换行符。
public static TNode AddNewlineToAnnotated<TNode>(this TNode node, string annotationKind)
where TNode : CSharpSyntaxNode =>
node.ReplaceNodes(node.GetAnnotatedNodes(annotationKind), (_, n) =>
n.WithLeadingTrivia(n.GetLeadingTrivia()
.Insert(0, SyntaxTree.ElasticEndOfLine(Environment.NewLine))
)
);
获得领先的琐事会为您提供SyntaxTriviaList
,您可以Add()
,Insert()
或以其他方式修改琐事列表,为您提供新的琐事列表。