我的代码库中有一些不推荐使用的方法,我知道我应该如何替换它们,有没有办法自动执行此操作?我使用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甚至其他文本编辑器来解决问题。我没有手动操作的原因是因为代码库太大了。
答案 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