Получение всех классов в проекте и их пакетов из расширения CodeRush - PullRequest
1 голос
/ 22 мая 2010

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

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

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

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

1 Ответ

2 голосов
/ 25 мая 2010

Кстати, похоже, Рори исправил некоторые ошибки в плагине "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 = "Необъявленный элемент";

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

...