Visual Studio 2015 — Изменение ссылок на устаревшие методы Stack Overflow

У меня есть несколько методов, которые устарели в моей кодовой базе, и я знаю, как их заменить, есть ли способ сделать это автоматически? Я использую 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 или даже других текстовых редакторов. Причина, по которой я не делаю это вручную, заключается в том, что кодовая база слишком велика.

2

Решение

Измените старую функцию, чтобы она вызывала новую с этим аргументом, являющимся истинным (объявите новую выше старой, конечно):

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

Вы, вероятно, можете встроить это тоже, так что компилятор буквально изменит код для вас, где это уместно 🙂

1

Другие решения

Вы можете сделать это с нашими DMS Software Reengineering Toolkit, с помощью Преобразования источника в источник DMS.

DMS анализирует (C ++ 17 / VisualStudio2015) исходный код в AST, применяет преобразования источник-источник, которые модифицируют дерево, и результирующий AST печатается для регенерации (модифицированного) исходного кода. Это позволяет надежно автоматизировать изменения кода для больших баз кода.

Правила перезаписи DMS для примеров OP выглядят так:

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
}

Краткое объяснение: правила имеют форму

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

У правил есть имена, чтобы люди и наборы правил могли обращаться к ним удобно; иногда можно иметь тысячи правил для выполнения очень сложных преобразований. У правила есть параметры, указывающие, какие метавариабельные переменные (записанные \ v) разрешены внутри правила. Нотация «functioncall-> functioncall» означает, что мы преобразуем вызовы функций в вызовы функций, а не что-то еще. Кавычки вокруг текста C ++ метакавычки, отделяющие текст C ++ от текста правила DMS, заставляют нас избегать фактических буквенных кавычек строки C ++ с помощью \ «. [Да, мы могли бы спроектировать DMS, чтобы этот случай не был экранирован; не всегда может быть достаточно умным].

Набор правил просто группирует правила, чтобы все они могли быть применены как группа. Не показан тривиальный вызов DMS для применения набора правил.

Вы можете прочитать больше о синтаксисе правил по ссылке выше.

Я реализовал его правила не так, как выразился ОП. Его примеры показывают изменение только вызова функции как оператора (обратите внимание на «;» в его примерах), но он пишет в тексте, что хочет заменить все вызовы функций. Таким образом, эти правила касаются изменений вызовов функций, а не операторов. Первое правило ОП я записал именно так, как он показал в своем примере; это будет работать только в том случае, если вызов функции имеет буквально эти строковые литералы аргументов. Своё второе правило я обобщил так, чтобы разрешить произвольную буквальную строку, а не просто «мир». Третье правило я обобщил, чтобы разрешить произвольное имя функции и добавил проверку типа, как он указал.

Обратите внимание, что сопоставление с шаблоном происходит на самом деле по синтаксическим деревьям, а не по необработанному тексту DMS не будет одурачен вызовами функций внутри комментариев или другими пробелами / форматированием.

1

Как насчет использования «Edit | Find & заменить | Заменить в файлах «?
замещать «Привет, мир с «Привет», правда, мир

-1
По вопросам рекламы [email protected]