Visual Studio自定义语言服务
我正在尝试在使用MPF的VSPackage中实现语言服务,但它的工作并不像我理解的那样。Visual Studio自定义语言服务
我有几个已经实现,如ParseSource
解析与ParseRequest
输入文件。但是,当它发现错误时,它会将其与AuthoringSink.AddError
相加。这意味着它的文档将它添加到我的错误列表中;它没有。
我也有一个简单的MySource
类,一个Source
的子类。我用一个覆盖的LanguageService.CreateSource
方法返回这个新类。 OnCommand
的文档说,当输入命令时它被解雇了。但是,事实并非如此。
显然有一些中间步骤我没有做好。我已经足够啰嗦了,所以我很乐意根据要求提供任何其他细节。
任何澄清是非常感谢。
对于AuthoringSink错误列表问题,我在我的语言服务中使用此行为。在ParseSource中,ParseRequest类有一个AuthoringSink。如果你想在解析器的行为之外工作,你也可以创建一个新的ErrorListProvider。这里是一些示例代码:
error_list = new ErrorListProvider(this.Site);
error_list.ProviderName = "MyLanguageService Errors";
error_list.ProviderGuid = new Guid(this.errorlistGUIDstring.);
}
ErrorTask task = new ErrorTask();
task.Document = filename;
task.CanDelete = true;
task.Category = TaskCategory.CodeSense;
task.Column = column;
task.Line = line;
task.Text = message;
task.ErrorCategory = TaskErrorCategory.Error;
task.Navigate += NavigateToParseError;
error_list.Tasks.Add(task);
我希望这是有帮助的。
按需应该被解雇每次有命令,在你的MYSOURCE类,你可以做这样的事情(从工作中拉)时间:
public override void OnCommand(IVsTextView textView, VsCommands2K command, char ch)
{
if (textView == null || this.LanguageService == null
|| !this.LanguageService.Preferences.EnableCodeSense)
return;
if (command == Microsoft.VisualStudio.VSConstants.VSStd2KCmdID.TYPECHAR)
{
if (char.IsLetterOrDigit(ch))
{
//do something cool
}
}
base.OnCommand(textView, command, ch);
}
如果不行仔细检查CodeSense =设置LanguageService包时,您的ProvideLanguageService属性为true。 LanguageService中很多很酷的功能需要正确打开这些属性。有些甚至给予免费的酷行为!
另一件需要注意的事情是,根据我的经验,某些行为(如着色器)在蜂房中无法正常工作。我不认为这些是给我带来麻烦的,但是我在几年前实施了这些,所以我主要只是回顾旧代码。
AuthoringSink.AddError
只会在错误列表中增加错误,如果ParseRequest.Reason
是ParseReason.Check
。当您的ParseSource
函数试图在解析其他任何ParseReason
时添加错误时,什么都不会发生。
您的语言服务可能永远不会呼叫ParseSource
与此ParseReason
。据我所知,only way得到ParseReason
的Check
(手动调用BeginParse
或ParseSource
以外)是proffer your service with an idle timer。
请注意,对于面向Visual Studio 2010及更新版本的扩展,MPF语言服务已过时。如果可能的话,你应该考虑使用新的MEF接口(除非你需要定位Visual Studio 2008或更早的版本)。 – 2014-03-26 12:50:06