2015-09-24 2 views
0

Я хотел бы создать код исправления Roslyn, что изменения приписываемое например, такого кода:Может ли код Roslyn Fix работать на нескольких независимых сайтах?

public class CommandHandler 
{ 
    [Command("Cmd1")] 
    public void Foo() 
    { 
     // do something 
    } 

    [Command("Cmd2")] 
    public void Bar() 
    { 
     // do something 
    } 
} 

к этому:

public class CommandHandler 
{ 
    public void Foo() 
    { 
     // do something 
    } 

    public void Bar() 
    { 
     // do something 
    } 

    public void Execute(string command) 
    { 
     switch(command) 
     { 
      case "Cmd1": 
       Foo(); 
       break; 
      case "Cmd2": 
       Bar(); 
       break; 
     } 
    } 
} 

Основные требования:

  • Подпись для рефакторинга - любой метод, связанный с атрибутом [Command].
  • В классе может быть несколько таких методов.
  • Метод синтезированного Execute() должен сохранять существующие случаи и добавлять новые.

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

+1

Одна вещь, которую вы можете сделать, это проверить каждый метод, см если у него есть атрибут, и если это так: посмотрите, есть ли у вас метод 'Execute()'. Если вы это сделаете, добавьте этот случай; если вы этого не сделаете: вы создаете метод и добавляете его. –

ответ

3

Для этого я бы воспользовался поставщиком анализатора кода.

  1. Анализатор исследует узлы SyntaxKind.Attribute рода и сообщает диагностический, если атрибут соответствует вашему CommandAttribute типа.

  2. Поставщик исправления кода предоставляет как RegisterCodeFixesAsync для рефакторинга одного атрибута, так и настраиваемого FixAllProvider, который может реорганизовать все атрибуты в документе/проекте/решении.

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

Смежные вопросы