Как заменить аналогичный код в VS 2017.

Я заменяю нашу функциональность регистрации, и требуется много времени, чтобы вручную просмотреть весь код и заменить его.

Вот текущий код:

Сообщения об ошибках:

cLogger.LogMessage(ComponentID.ClientID, CLASS_NAME, "AddContextMenuItem", MessageType.mtErrorMessage, "Null MenuItem provided. MenuItem's status not changed");

cLogger.LogMessage(ComponentID.ClientID, CLASS_NAME, "enableDisableToolbarItem", MessageType.mtErrorMessage, "Invalid toolbaritem provided.");

Исключения:

cLogger.LogMessage(ComponentID.ClientID, CLASS_NAME, "enableDisableContextMenuItem", MessageType.mtException, ex);

cLogger.LogMessage(ComponentID.ClientID, CLASS_NAME, "AddToolbarItem", MessageType.mtException, exc);

Существует ли простой способ создания макроса (никогда ранее не использовавшегося макроса) или сценария power shell или notepad++ или чего-то еще, чтобы найти и заменить все эти различные экземпляры, чтобы они выглядели следующим образом:

Новые сообщения об ошибках:

logger.Log(LogLevel.Error, CLASS_NAME + " AddContextMenuItem - Null MenuItem provided. MenuItem's status not changed");

logger.Log(LogLevel.Error, CLASS_NAME + " enableDisableToolbarItem - Invalid toolbaritem provided.");

а также

Новые исключения:

logger.Log(LogLevel.Exception, CLASS_NAME + " enableDisableContextMenuItem - " + ex);

logger.Log(LogLevel.Exception, CLASS_NAME + " AddToolbarItem - " + exc);

Я заменяю код во всем проекте, и это займет слишком много времени, чтобы пройти и вручную изменить весь код регистрации вручную. Любая помощь с благодарностью.

2 ответа

Решение

Есть несколько вариантов:

  1. Поиск и замена регулярных выражений в Visual Studio:

    искать пример исключения

    \w+logger.LogMessage\([^,]+,([^,]+),([^,]+),[^,]+,([^\",]+)\);
    

    замещать

    logger.Log(LogLevel.Exception, $1 + $2 + $3);
    
  2. Используйте Resharper структурный поиск и замена

  3. Создать CodeFix для Roslyn

Да, вы можете сделать это с помощью регулярного выражения, возможно, проще в PowerShell, чем в Notepad++ или, возможно, VSCode.

На ваших примерах сложно сказать, что именно вы меняете в каждом элементе, но основная идея заключается в следующем:

  1. Соответствует статическому тексту, который устанавливает тип элемента для изменения
  2. Также сопоставьте текст переменной с подстановочными знаками (.* И т. Д.), Заключенными в круглые скобки CAPTURING.
  3. Замените новым статическим текстом и "переставленным" переменным текстом, используя обратные ссылки $1, $2 и т. Д. На группы захвата (или $Matches[1] и т. Д.)

Если #3 более сложный, вам придется дополнительно изменить текст переменной перед заменой - вот где язык сценариев имеет преимущество перед чистым поиском и заменой.

Вот упрощенный пример (PowerShell, но аналогичный в других языках или редакторах, которые поддерживают регулярные выражения) для статической замены "FunctionOldName" при изменении порядка Param1 и Param2 и изменения имен на основе исходных имен для этих параметров:

"Function_OldName Param1 Param2" -replace 'Function_OldName\s+(\w+)\s+(\w+)', 
                                          'NewFunctionName New$2Parm New$1Parm' 

$ 1 и $ 2 являются обратными ссылками на "1-е parens" и "2nd parens" соответственно в строке соответствия.

Если вы можете написать четкие примеры, показывающие, какие части вашего измененного текста должны быть сопоставлены, просто изменены, переставлены или перестроены, то, возможно, можно будет показать вам несколько более подходящих примеров...

Вы можете сделать это для многих файлов либо с помощью PowerShell, либо с помощью редакторов, но, как правило, сделать это для многих файлов снова немного проще в языке программирования (например, PowerShell).

Get-ChildItem *.PS1 -recurse | ForEach-Object { 
  'Function_OldName\s+(\w+)\s+(\w+)',   # your match goes here
  'NewFunctionName New$2Parm New$1Parm' # your replacement goes here
}
Другие вопросы по тегам