我正在查看 Roslyn 的 CompletionService ,并且 ShouldTriggerCompletion 被定义为

public virtual bool ShouldTriggerCompletion(
    SourceText text,
    int caretPosition,
    CompletionTrigger trigger,
    ImmutableHashSet<string> roles = null,
    OptionSet options = null
) { … }

其中 CompletionTrigger 是单个 char Character 的包装器。

这似乎意味着我应该在打字时在每个字符上调用 ShouldTriggerCompletion - 但是这意味着我需要更新每个字符上的 SourceText ,它分配一个 TextChange 数组,一个新的 SourceText 和可能的其他取决于其内部结构的东西。

我是否正确理解此 API?打字时使用它的最有效方法是什么?

编辑: 澄清一下,我知道我可以再猜测它,并且只调用它让我们说 . 。但我的目标是按照预期的方式使用 API,除了已经提供的优化之外,没有任何优化。

最佳答案



是的,在 Visual Studio 中每次击键时,我们都会创建一个新的 SourceText 和一个新的文档/项目/解决方案快照。我们必须这样做,因为所有功能都取决于现有的 Document 实例。

对我们来说,这样的手术很便宜。 Visual Studio 中的文本编辑器组件已经为每次编辑创建了一个廉价的 ITextSnapshot,它通过非常奇特的数据结构(想想字符串片段的二叉树)来实现,因此它尽可能便宜。当我们在编辑器中为文件创建 SourceTexts 时,我们改为创建我们的 own derived type of SourceText,我们只是将数据请求转发到编辑器 ITextSnapshot API。 SourceText 实际上拥有 ITextSnapshot 成员的一个子集并非巧合,因为我们正是为这种模式设计的!

关于.net - 键入时使用 Roslyn 的 CompletionSevice 的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39421668/

10-13 06:21