Visual Studio自定义语言服务



我正试图使用MPF在VSPackage中实现语言服务,但它并没有像我所理解的那样正常工作。

我已经有了几个实现,比如ParseSourceParseRequest解析输入文件。但是,当它发现错误时,它会将其添加到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.ReasonParseReason.Check时将错误添加到错误列表中。当您的ParseSource函数在解析任何其他ParseReason时尝试添加错误时,将不会发生任何事情。

您的语言服务可能从未使用此ParseReason调用过ParseSource。据我所知,获得Check中的ParseReason(除了自己手动调用BeginParseParseSource)的唯一方法是使用空闲计时器提供服务。

最新更新