c# - 使用 Roslyn 替换 C# 中的标识符

标签 c# roslyn

我是 Roslyn 的新手,需要从哪里开始的正确方向。

我的任务是编写一个工具来自动更改语法树中变量/函数/类/等的标识符,以满足我们通用的命名标准。

例如:

public class t_user {
  public string m_name;
  public int m_age;
}
t_user[] inactive_users;

需要改为:

public class CUser {
  public string Name;
  public int Age;
}
CUser[] inactiveUsers;

所以任务看起来像:获取所有声明,为每个声明生成新的唯一标识符,更改树中所有出现的地方。

找到一些关于使用 SyntaxRewriters 进行语法转换的文档,但它看起来太复杂而无法开始。 如果能帮助指明方向,我将不胜感激。

谢谢!

附言 我需要这样的东西:

SyntaxTree tree = CSharpSyntaxTree.ParseText ( File.ReadAllText(path) ); 
/* ...rename symbols... */ 
File.WriteAllText ( tree.ToString(), path );

具有重命名功能(刚开始)

    static string renamer ( string id ){
        if( id.StartsWith("m_") ){
            return id.Substring(2,1).ToUpper()+id.Substring(3); // m_abc -> Abc
        }
        if( id.StartsWith("t_") ){
            return "C"+id.Substring(2,1).ToUpper()+id.Substring(3); // t_abc -> CAbc
        }
        return  id;
    }

最佳答案

您不能仅通过字符串操作来实现重命名器。您必须使用符号来理解代码和每个语法节点的符号含义,以了解是否需要重命名。

有一个 renamer 类可以为您完成。

如果你想自己做一个练习,你需要遍历节点,然后获取符号,检查它是否确实是你想要更改的节点(例如,字段名称而不是 using statement...),然后找到所有locations\references\interface implementations并更改它。

关于c# - 使用 Roslyn 替换 C# 中的标识符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59213164/

相关文章:

c# - 如何抑制所有类型成员的代码分析消息?

c# - Xml 文档 - 参数上的 <see> 标记

c# - FileNotFoundException 随机抛出

c# - Enumerable.Count()==n 的替代品

c# - 为什么 IL 设置这个值两次?

asp.net-mvc - VS 2015、C# 6、MVC5、Roslyn — Azure Web 应用程序上出现 502 网关错误

c# - DataGridView 将列中的所有值写入列表

c# - 如何强制mongo以小写形式存储成员?

c# - 将 Roslyn 代码重构作为 NuGet 包发送

roslyn - roslyn 可以提供哪些代码优化