我正在编写一个COM插件,该插件扩展了迫切需要它的IDE。这里涉及许多功能,但是为了这篇文章,我们将其缩小到2:
- 有一个“代码资源管理器”工具窗口,其中显示一个树状视图,允许用户浏览模块及其成员。
- 有一个“代码检查”工具窗口,其中显示一个datagridview,可让用户浏览代码问题并自动修复它们。
两种工具都有一个“刷新”按钮,用于启动异步任务,该任务将解析所有打开的项目中的所有代码。该代码浏览器使用的解析结果建立树形视图和代码评审使用的解析结果,以找出代码问题并显示其结果的datagridview。
我在这里想要做的是在功能之间共享解析结果,以便在代码浏览器刷新时,代码检查会知道它并可以刷新自身,而无需重做代码浏览器刚刚进行的解析工作。
因此,我做了什么,将解析器类设置为事件提供者,这些功能可以注册到:
private void _parser_ParseCompleted(object sender, ParseCompletedEventArgs e)
{
Control.Invoke((MethodInvoker) delegate
{
Control.SolutionTree.Nodes.Clear();
foreach (var result in e.ParseResults)
{
var node = new TreeNode(result.Project.Name);
node.ImageKey = "Hourglass";
node.SelectedImageKey = node.ImageKey;
AddProjectNodes(result, node);
Control.SolutionTree.Nodes.Add(node);
}
Control.EnableRefresh();
});
}
private void _parser_ParseStarted(object sender, ParseStartedEventArgs e)
{
Control.Invoke((MethodInvoker) delegate
{
Control.EnableRefresh(false);
Control.SolutionTree.Nodes.Clear();
foreach (var name in e.ProjectNames)
{
var node = new TreeNode(name + " (parsing...)");
node.ImageKey = "Hourglass";
node.SelectedImageKey = node.ImageKey;
Control.SolutionTree.Nodes.Add(node);
}
});
}
而且有效。我遇到的问题是...有效-我的意思是,当代码检查刷新时,解析器告诉代码浏览器(和其他所有人)“老兄,有人在解析,您想为此做些什么? ” -解析完成后,解析器告诉其侦听器“是的,我有新的解析结果供您使用,您想为此做些什么?”。
让我通过一个例子来说明这个问题:
- 用户打开代码浏览器,告诉用户“等等,我在这里工作”;用户继续在IDE中工作,代码资源管理器重绘自身,生活很美好。
- 然后,用户调出代码检查,告诉用户“等等,我在这里工作”;解析器告诉代码浏览器“伙计,有人在解析,您想对此做些什么?” -代码浏览器告诉用户“等等,我在这里工作”;用户仍然可以在IDE中工作,但由于它令人耳目一新,因此无法浏览代码浏览器。而且他也在等待代码检查完成。
- 用户在要解决的检查结果中看到代码问题;他们双击导航到它,确认代码存在问题,然后单击“修复”按钮。该模块已修改,需要重新解析,因此代码检查将继续进行;代码浏览器告诉用户“等等,我在这里工作”,...
看到这是怎么回事?我不喜欢它,我敢打赌用户也不喜欢它。我想念什么?我应该如何在要素之间共享解析结果,而又让用户控制何时应该执行要素?
我问的原因是因为我认为,如果我将实际工作推迟到用户积极决定刷新之前,并且将解析结果“缓存”进来……那么我将刷新树形视图,在可能过时的解析结果中定位代码问题……这实际上使我回到了第一个问题,每个功能都具有自己的解析结果:我可以通过任何方式在功能之间共享解析结果并拥有漂亮的UX吗?
代码是c#,但是我不是在寻找代码,而是在寻找概念。
VBAParser
由ANTLR生成,并为我提供了一个解析树,但是这些功能不会消耗它。该RubberduckParser
解析树,走它,并发出VBProjectParseResult
一个包含Declaration
有对象所有的References
解决- 这是什么功能需要输入..所以是的,这几乎是一个全有或全无的情况。该RubberduckParser
是足够聪明,给没有被修改虽然不是重新解析模块。但是,如果存在瓶颈,则不是解析,而是代码检查。