3

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

我已经有几个实现,例如ParseSource使用ParseRequest. 但是,当它发现错误时,它会将其添加到AuthoringSink.AddError. 这方面的文档意味着它将它添加到我的错误列表中;它没有。

我也有一个简单MySource的类,一个Source. 我用一个重写的LanguageService.CreateSource方法返回这个新类。的文档OnCommand说它在“输入命令时”被触发。然而,事实并非如此。

显然有一些中间步骤我没有正确完成。我已经说得够多了,所以我很乐意应要求提供任何其他详细信息。

任何澄清都非常感谢。

4

2 回答 2

1

AuthoringSink.AddError如果是,则仅将错误添加到错误列表ParseRequest.ReasonParseReason.Check。当您的ParseSource函数在解析任何其他时尝试添加错误时ParseReason,什么都不会发生。

您的语言服务可能永远不会ParseSource使用 this调用ParseReason。据我所知,获得of的唯一方法(除了手动调用或您自己之外)是为您的服务提供一个 idle timerParseReasonCheckBeginParseParseSource

于 2014-02-27T19:49:44.400 回答
1

对于 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 包时仔细检查 ProvideLanguageService 属性中的 CodeSense = true。LanguageService 中的很多很酷的事情都需要正确打开这些属性。有些甚至免费提供很酷的行为!

另一件需要注意的事情是,根据我的经验,着色器等某些行为在蜂巢中无法正常工作。我不认为这些给我带来了麻烦,但我在几年前实现了这些,所以我主要只是回顾旧代码。

于 2012-08-30T21:47:28.133 回答