我正试图使用MPF在VSPackage中实现语言服务,但它并没有像我所理解的那样正常工作。
我已经有了几个实现,比如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);
我希望这会有所帮助。
每次有命令时,OnCommand都应该启动,在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);
}
如果这不起作用,请在设置LanguageService包时仔细检查ProviderLanguageServices属性中的CodeSense=true。在LanguageService中做很多很酷的事情都需要正确打开这些属性。有些甚至免费提供很酷的行为!
另一件需要注意的事情是,根据我的经验,一些行为(如着色器)在蜂箱中无法正常工作。我不认为这些会给我带来麻烦,但我几年前就实现了这些,所以我主要只是回顾一下旧代码。
AuthoringSink.AddError
仅在ParseRequest.Reason
为ParseReason.Check
时将错误添加到错误列表中。当您的ParseSource
函数在解析任何其他ParseReason
时尝试添加错误时,将不会发生任何事情。
您的语言服务可能从未使用此ParseReason
调用过ParseSource
。据我所知,获得Check
中的ParseReason
(除了自己手动调用BeginParse
或ParseSource
)的唯一方法是使用空闲计时器提供服务。