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

我花了一些时间试图找到CodeRush可以添加的方式,当它找到未声明的元素,在事实类名称中没有使用添加。 在我的问题 ( Refactor_resolve )的答案中建议的解决方案不起作用(故障?)。

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

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

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

顺便说一下,看起来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 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 =“Undeclared element”;

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