从CodeRush扩展获取项目及其包中的所有类
我花了一些时间试图找到CodeRush可以添加的方式,当它找到未声明的元素,在事实类名称中没有使用添加。 在我的问题 ( Refactor_resolve )的答案中建议的解决方案不起作用(故障?)。
在一个过程中,我发现为CodeRush编写插件很容易,所以我决定自己编写这个function(并分享它)。 我只实现了一个CodeProvider
(就像在本教程中一样 )。 唯一认为我需要做的工作就是回答这个问题:
-
在我的插件启动时,我需要获得所有类及其包的列表(设置,映射,等等)。 这意味着项目中以及所有引用的库中的所有类(接口…)及其包。 而且我还需要接收更新(当用户添加引用时,创建新类)。 我可以从一些CodeRush类或
CodeProvider
类提供的VS接口中获取此信息吗? -
如何将创建的
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”;
如果您需要进一步的帮助,请告诉我。