如何用语义信息自动重写c++代码?

hlswsv35  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(128)

我想要的是应用一个就像{ {ObjA}.func1() -> {ObjA}.func2() | for all {ObjA} is {SpecClass}}一样的变换。也就是说,将SpecClass类型的所有对象的对A::func1()的函数调用变换为A::func2()
显然,它需要语义信息来完成这一任务。是否有任何现有的工具可以完成这样的任务(或者可能更强大)?或者我需要使用Clang-LibTooling或其他工具来开发一个工具?
改造前:

struct A{
    void f();
    void g();
};

struct B{
    void f();
    void g();
};

void foo()
{
    A a;
    B b;
    a.f();
    b.f();
}

改造后:

struct A{
    void f();
    void g();
};

struct B{
    void f();
    void g();
};

void foo()
{
    A a;
    B b;
    a.g();
    b.f();
}
pepwfjgg

pepwfjgg1#

假设我正确地解释了这个问题(即,将其应用于源代码),这在IDE中是很常见的。
例如,Visual Studio可以将成员函数func1重命名为func2,然后将所有调用ObjA.func1()更改为ObjA.func2()
如果func2已存在,则:
1.将func2更改为func2dummy-不使用重构
1.将func1重命名为func2-使用重构
1.将func2改回func1,将func2dummy改回func2-不使用重构
其他重构工具,包括基于llvm的重构工具,也可以做同样的事情。

相关问题