c# - 使用 Roslyn 有选择地删除预处理器指令

标签 c# roslyn preprocessor roslyn-code-analysis

我想使用 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 就没那么容易了。

我尝试了两种策略:

  1. 在这里,我在分析器中查找#else//TEST_1_0,并为该位置创建代码修复
  2. 这里我只是在analyzer中为#if TEST_1_0创建了一个codefix,并尝试从CodeFixprovider获取相应的else

两者都很快变得非常复杂,指令是琐事似乎有问题,它们分布在不同 SyntaxTokens 的 leadingTrivia 上。代码中的更改会在很大程度上影响位置指令,因此看起来要对所有情况进行编程需要做很多工作。

我错过了什么吗?有没有更简单的方法来做到这一点而无需手动编程所有不同的情况?

你会选择策略 1 还是策略 2?

最佳答案

我同意 Arjan - Roslyn 不能用于该任务。为了解决类似的任务,我基于正则表达式和 Python sympy 库制作了自己的简单 C# 预处理器工具:undefine .我相信这会对你有所帮助。至于您描述的任务,请尝试以下命令:

>> python undefine apply -d TEST_1_0 YourFile.cs

关于c# - 使用 Roslyn 有选择地删除预处理器指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46871023/

相关文章:

c# - iPad 上的 iOS 应用程序删除点十进制值

c# - C# 或 VB 文档注释中的粗体或斜体?

c# - 使用 Roslyn 语义模型在单个 .cs 文件中查找符号

preprocessor - 使用 m4 进行预处理

包括使用 Fortran 预处理器进行显示

c# - 使用列表作为 DataGridView 的数据源

c# - 单个 LINQ 表达式来计算数据集中的多个列

c# - 使用错误的服务器证书进行第一个请求时 HttpWebRequest 超时

c# - 通过 Roslyn 编译解决方案时忽略 InternalsVisibleTo 属性

visual-studio-2008 - 在 Visual Studio 2008 中,是否有识别 64 位 Windows 操作系统的宏?