我想使用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

10-07 19:43
查看更多