我想使用Roslyn清除某些较早的预处理程序指令的代码。
例如,从此代码
#define TEST_1_0
#define TEST_1_1
namespace ConsoleApplication1
{
class TypeName
{
public static void Main(string[] args)
{
#if TEST_1_0
int TEST_1_0 = 1;
#if TEST_1_1
int TEST_1_1 = 1;
#else//TEST_1_1
int TEST_1_1 = 0;
#endif//TEST_1_1
#else//TEST_1_0
int TEST_1_0 = 0;
#endif//TEST_1_0
}
}
}
我想删除else // TEST_1_0,但保留else // TEST_1_1。我不能指望这些评论,因此应该将#if及其对应的#else(如果有)关联起来。
查找#if很容易,但是查找相应的#else则不那么容易。
我尝试了两种策略:
在这里,我在分析器中查找#else // TEST_1_0,并为该位置创建一个代码修正
在这里,我只是在分析器中为#if TEST_1_0创建一个代码修补程序,然后尝试从CodeFixprovider中获取相应的else
两者都变得非常复杂,伪指令是琐事,这似乎是有问题的,它们分散在不同SyntaxTokens的leadTrivia上。代码中的更改在很大程度上影响了位置指令,因此对所有情况进行编程似乎需要大量工作。
我想念什么吗?有没有一种简便的方法,而无需手动编程所有不同的情况?
您会选择策略1还是2?
最佳答案
我同意Arjan-Roslyn无法完成任务。为了解决类似的任务,我基于regexp和Python sympy库制作了自己的简单C#预处理器工具:undefine。我相信这会对您有所帮助。对于您描述的任务,请尝试以下命令:>> python undefine apply -d TEST_1_0 YourFile.cs