我花了一些时间试图找到CodeRush可以添加的方式,当它找到未声明的元素时,事实类名称没有使用添加。解决方案建议in this answer to my question(Refactor_resolve)不起作用(错误?)。
在一个过程中,我发现为CodeRush编写插件很简单,所以我决定自己编写这个功能(并分享)。我只会实现CodeProvider
(例如this tutorial)。唯一认为我需要做的工作就是回答这个问题:
在我的插件启动时,我需要
得到一个列表(集,地图,等等)
所有课程及其包。这个
意味着所有类(接口......)
和他们在项目中的包,和
在所有引用的库中。和
我还需要收到更新
这(当用户添加参考时,
创造新的课程)。 我可以从某些CodeRush类或CodeProvider
类提供的VS界面获取此内容吗?
如何将创建的CodeProvider
添加到用户将鼠标悬停在某个问题上时显示的弹出窗口中?
答案 0 :(得分:2)
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 =“未声明的元素”;
如果您需要进一步的帮助,请与我们联系。