从CodeRush扩展获取项目及其包中的所有类

时间:2010-05-22 00:11:00

标签: c# visual-studio plugins coderush

我花了一些时间试图找到CodeRush可以添加的方式,当它找到未声明的元素时,事实类名称没有使用添加。解决方案建议in this answer to my questionRefactor_resolve)不起作用(错误?)。

在一个过程中,我发现为CodeRush编写插件很简单,所以我决定自己编写这个功能(并分享)。我只会实现CodeProvider(例如this tutorial)。唯一认为我需要做的工作就是回答这个问题:

  1. 在我的插件启动时,我需要 得到一个列表(集,地图,等等) 所有课程及其包。这个 意味着所有类(接口......) 和他们在项目中的包,和 在所有引用的库中。和 我还需要收到更新 这(当用户添加参考时, 创造新的课程)。 我可以从某些CodeRush类或CodeProvider类提供的VS界面获取此内容吗?

  2. 如何将创建的CodeProvider添加到用户将鼠标悬停在某个问题上时显示的弹出窗口中?

1 个答案:

答案 0 :(得分:2)

顺便说一句,看起来Rory修复了“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 =“未声明的元素”;

如果您需要进一步的帮助,请与我们联系。