更改对已弃用方法的引用C ++

时间:2017-10-04 13:49:04

标签: c++ visual-studio-2015 refactoring deprecated automated-refactoring

我的代码库中有一些不推荐使用的方法,我知道我应该如何替换它们,有没有办法自动执行此操作?我使用Visual Studio 2015更新3,但我可以使用其他文本编辑器...

代码如下所示:

// Deprecated method
myFunction(char* firstParam, char* secondParam = NULL);

// New method, same name, different params
myFunction(char* firstParam, bool flag, char* secondParam = NULL);

我只想要一些东西可以替换对第一个函数的所有引用,并引用第二个函数。 即:

myFunction( "hello", "world");
// Replace with
myFunction( "hello", true, "world");

myFunction("hello");
// Replace with
myFunction("hello", true);

myFunction("hello", isTrue); // isTrue is a bool here
// Do not replace with anything

myFunction("hello", world); //world is a char* here
// Replace with
myFunction("hello", true, world);

我可以使用visual studio甚至其他文本编辑器来解决问题。我没有手动操作的原因是因为代码库太大了。

3 个答案:

答案 0 :(得分:1)

将旧函数更改为使用该参数为true调用new(当然,将旧函数声明为旧函数):

 // Deprecated method
 myFunction(char* firstParam, char* secondParam = NULL)
 {
     myFunction(firstParam, true, secondParam);
 }

你也可以内联它,所以编译器会在适当的时候为你改变代码:)

答案 1 :(得分:1)

您可以使用我们DMS Software Reengineering Toolkit,使用DMS's source-to-source transformations

执行此操作

DMS将(C ++ 17 / VisualStudio2015)源代码解析为AST,应用修改树的源到源转换,并且结果AST被精心打印以重新生成(修改)源代码。这允许人们以可靠的方式在大型代码库中自动执行代码更改。

OP示例的DMS重写规则如下所示:

rule add_true_to_hello_world()
    :functioncall->functioncall
    = "myFunction( \"hello\", \"world\");"
    -> "myFunction( \"hello\", true, \"world\");";

rule add_true_to_call_with_literal_string(s: STRING)
    : functioncall->functioncall
    = "myFunction(\s)"
    -> "myFunction(\s, true);"

rule add_true_when_char_star(i:IDENTIFIER,s:STRING, a:argument):
     :functioncall->functioncall
     = "\i(\s,\a);"
     -> "\i(\s, true, \a)"
     if IsCharStart(a);

ruleset replace_deprecated_calls =
    { add_true_to_hello_world,
      add_true_to_call_with_literal_string,
      add_true_when_char_star
    }

Breif解释:规则的格式为

rule name(metavariable): syntaxclass->syntaxclass
  lefthandside -> righthandside  if condition ;

规则具有名称,因此人员和规则集可以方便地引用它们;有时可能会有数以千计的规则来执行非常复杂的转换。规则具有指定规则内允许哪种类型的元变量(write \ v)的参数。 “functioncall-> functioncall”表示法意味着我们正在将函数调用转换为函数调用而不是其他东西。 C ++文本周围的引号是 meta 引用从DMS规则文本中分隔C ++文本,导致我们需要使用\“转义实际的C ++文字字符串引号。[是的,我们可能设计了DMS来制作它案件没有逃脱;不能总是足够聪明]。

规则集只是将规则分组,它们都可以作为一个组应用。未显示的是应用规则集的简单DMS调用。

您可以在上面的链接中阅读有关规则语法的更多信息。

我实施的规则与OP表达的不同。他的例子只显示了一个函数调用作为一个声明(注意他的例子中的“;”)变了,但他在文中写道他想要替换所有的函数调用。因此,这些规则是关于函数调用的更改,而不是语句。 OP的第一条规则就像他在他的例子中所展示的一样;它只有在函数调用具有字面意义的字符串文字时才有效。他的第二条规则我概括为允许任意文字字符串而不仅仅是“世界”。第三条规则我概括为允许任意函数名称,并在他指示时添加了类型检查。

请注意,模式匹配实际上发生在语法树而不是原始文本上。 DMS不会被注释中的函数调用或不同的whitespacing /格式化所欺骗。

答案 2 :(得分:-1)

使用“编辑|查找和替换|替换文件”怎么样? 用“Hello”替换“Hello”,world ,true,world