提供语言服务的问题

2024-04-01

我发现了两种在互联网上提供语言服务的方法。

第一种方式 http://msdn.microsoft.com/fr-fr/library/vstudio/bb166498%28v=vs.110%29.aspx涉及使用IOleComponentManager并注册一个计时器以在空闲时间调用我的服务。

第二种方式 http://social.msdn.microsoft.com/Forums/vstudio/en-US/37f5e070-454b-4a1a-83f8-4c0ee3290019/problem-with-language-service-walkthrough?forum=vsx涉及将我的服务包装为IServiceContainer并添加一个ServiceCreatorCallback“按需提供服务”。

据说第二种方式现在是做事的“首选方式”。不幸的是,当我使用这种方法时,OnSynchronizeDropdowns从来没有被叫过我的TypeAndMembersDropdownBars执行。

另外,当我的LanguageService发现文件中的错误,它使用ParseRequest.Sink.AddError()将错误添加到错误列表中。当提供“按需”时,这些错误不会显示在 GUI 中,即使我在调试代码时看到它们被添加。

我知道我的语言服务正在注册,因为语法突出显示、“转到定义”和“查找所有引用”仍然有效。

这是我用来“按需提供服务”的代码:

IServiceContainer serviceContainer = this as IServiceContainer;
ServiceCreatorCallback callback = new ServiceCreatorCallback(CreateLanguageService);
serviceContainer.AddService(typeof(MyLanguageService), callback, true);

谁能告诉我为什么我的某些功能LanguageService按需提供时不起作用?我是否遗漏了一些东西,或者这种方式不适合功能齐全的语言服务?


看起来至少缺少的功能需要使用IOleComponentManager注册一个定时器来调用语言服务的方法空闲期.

Using dotPeek http://www.jetbrains.com/decompiler/, 我找到OnSynchronizeDropdowns()接到来自OnCaretMoved()用于在编辑器中单击时同步所选项目。OnCaretMoved()本身似乎只能从LanguageService.OnIdle()方法,我认为这需要使用空闲计时器。

经过更多挖掘后,我还发现错误列表要求ParseRequest.Reason被设置为ParseReason.Check,否则它会忽略该调用。进一步挖掘代码,我发现唯一使用解析原因的地方是Source.OnIdle().

Update:我相信我已经确认这两项功能需要注册空闲计时器。来自MSDNLanguageService.OnIdle http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.package.languageservice.onidle.aspx:

Note除非您设置自己的计时器并调用,否则不会调用此方法 此方法来自计时器处理程序。

基本方法调用插入符号移动 http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.package.languageservice.oncaretmoved.aspx如果自上次以来插入符号已移动 时间OnIdle被称为。然后基方法调用 OnIdle 方法 于Source http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.package.source.aspx当前视图的对象。如果当前Source http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.package.source.aspx无法获取对象,基本方法根本不执行任何操作, 包括不打电话插入符号移动 http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.package.languageservice.oncaretmoved.aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提供语言服务的问题 的相关文章