1

我花了一些时间试图找到一种方法,当 CodeRush 发现未声明的元素位于事实类名中而没有添加 using 时,它可以添加 using。这个回答我的问题Refactor_resolve )中建议的解决方案不起作用(错误?)。

在一个过程中,我发现为 CodeRush 编写插件很容易,所以我决定自己编写这个功能(并分享它)。我只会实现一个CodeProvider(就像在本教程中一样)。我唯一需要做的就是回答这个问题:

  1. 在我的插件启动时,我需要获取所有类及其包的列表(集合、映射等)。这意味着项目中以及所有引用的库中的所有类(接口...)及其包。而且我还需要接收更新(当用户添加参考时,创建新类)。我可以从一些 CodeRush 类或CodeProvider类中可用的 VS 接口中得到这个吗?

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

4

1 回答 1

2

顺便说一句,看起来 Rory 已经修复了“Refactor_Resolver”插件中的一些错误,它现在可以工作了。至于您的问题,这里有一个快速回复:

回复 #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 = "未声明的元素";

如果您需要进一步的帮助,请告诉我。

于 2010-05-25T18:29:24.007 回答