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

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

关于c# - Visual Studio 自定义语言服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11654744/

10-13 06:52