Получение всех классов в проекте и их пакетов из расширения CodeRush

Я потратил некоторое время, пытаясь найти способ, которым CodeRush мог бы добавить использование, когда он находит необъявленный элемент, который находится в имени класса факта, без использования добавленного. Решение, предложенное в этом ответе на мой вопрос ( Refactor_resolve), не работает (прослушивается?).

В процессе я обнаружил, что написание плагинов для CodeRush легко, поэтому я решил сам кодировать эту функцию (и делиться ею). Я бы только реализовать CodeProvider (как в этом уроке). Единственное, что мне нужно для выполнения работы, - это ответы на следующие вопросы:

  1. При запуске моего плагина мне нужно получить список (набор, карта, что угодно) всех классов и их пакетов. Это означает, что все классы (интерфейсы...) и их пакеты в проекте и во всех ссылочных библиотеках. И мне также нужно получать обновленную информацию об этом (когда пользователь добавляет ссылку, создает новый класс). Могу ли я получить это из некоторых классов CodeRush или, может быть, VS интерфейс доступен с CodeProvider учебный класс?

  2. Как добавить созданный CodeProvider на всплывающее окно, которое отображается, когда пользователь наводит курсор на проблему?

1 ответ

Решение

Кстати, похоже, что Рори исправил некоторые ошибки в плагине "Refactor_Resolver", и теперь он работает. Что касается ваших вопросов, вот быстрый ответ:

RE # 1:

CodeRush имеет встроенный кеш для всех типов, ссылок на проекты и т. Д., Который создается во время анализа. Но на данный момент он используется внутри и не доступен для разработчиков плагинов, извините. Однако вот несколько полезных API для начала:

  // Using the source code cache...

  // gets the active Solution object
  SolutionElement activeSolution = CodeRush.Source.ActiveSolution;
  if (activeSolution == null)
    return;

  // iterate thought all projects in the solution
  foreach (ProjectElement project in activeSolution.AllProjects)
  {
    string assemblyName = project.AssemblyName;

    // iterate inside source code symbols cache...
    Hashtable projectSymbols = activeProject.ProjectSymbols;
    foreach (object item in projectSymbols.Values)
    {
      ITypeElement typeElement = item as ITypeElement;
      if (typeElement == null)
        continue;

      // TODO: ...
    }
  }

Чтобы получить кэш ссылок на сборки, используйте ScopeManager (находится в DevExpress.DXCore.MetaData.dll), например

  IEnumerable<IMetaDataScope> allMetaDataScopes = ScopeManager.All;
  foreach (IMetaDataScope scope in allMetaDataScopes)
  {
    IAssemblyInfo assembly = scope.Assembly;
    if (assembly != null)
    {
      ITypeInfo[] types = assembly.GetTypes();
      for (int i = 0; i < types.Length; i++)
      {
        ITypeInfo typeInfo = types[i];
        if (typeInfo == null)
          continue;

        // TODO: ...
      }
    }
  }

RE #2: чтобы добавить CodeProvider во всплывающее окно, установите его свойство "CodeIssueMessage" с именем проблемы с кодом, которую нужно исправить, например

myCodeProvider.CodeIssueMessage = "Необъявленный элемент";

Дайте мне знать, если вам нужна дополнительная помощь.

Другие вопросы по тегам