【发布时间】:2019-08-23 03:49:45
【问题描述】:
我有大量生成的 C# 代码,我希望使用 Roslyn 对其进行预处理,以协助后续手动重构。
代码包含具有已知结构的开始和结束注释块,我需要将块之间的代码重构为方法。
幸运的是,生成代码中的所有状态都是全局的,因此我们可以保证目标方法不需要参数。
例如下面的代码:
public void Foo()
{
Console.WriteLine("Before block");
// Start block
var foo = 1;
var bar = 2;
// End block
Console.WriteLine("After block");
}
应该转换成类似于:
public void Foo()
{
Console.WriteLine("Before block");
TestMethod();
Console.WriteLine("After block");
}
private void TestMethod()
{
var foo = 1;
var bar = 2;
}
显然,这是一个人为的例子。一个方法可以有任意数量的这些注释和代码块。
我已经研究了CSharpSyntaxRewriter,并且已经为这些 cmets 提取了SyntaxTrivia 对象的集合。我天真的方法是覆盖VisitMethodDeclaration(),识别开始和结束注释块之间的代码跨度范围,并以某种方式提取节点。
我已经能够使用node.GetText().Replace(codeSpan),但我不知道如何使用结果。
我见过很多使用 CSharpSyntaxRewriter 的例子,但所有例子似乎都微不足道,而且不涉及涉及多个相关节点的重构。
使用DocumentEditor 会更好吗?这种重构有通用的方法吗?
我可能很懒,根本不使用 Roslyn,但结构化的代码解析似乎比正则表达式和将源代码视为纯文本更优雅的解决方案。
【问题讨论】: