键入时使用Roslyn的CompletionSevice最有效的方法是什么?

时间:2016-09-10 01:34:49

标签: .net roslyn

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

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

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

这似乎暗示我应该在键入时在每个char上调用ShouldTriggerCompletion - 但这意味着我需要在每个char上更新SourceText,这个char分配一个TextChange数组,新的SourceText以及可能的其他内容取决于其内部结构。

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

编辑:为了澄清,我知道我可以进行二次猜测,只能通过调用它来说.。但我的目标是按照预期的方式使用API​​,除了已经提供的优化之外没有任何优化。

2 个答案:

答案 0 :(得分:2)

  

然而,这意味着我需要在每个char上更新SourceText,它分配一个TextChange数组,一个新的SourceText以及可能的其他内容,具体取决于其内部结构

是的,在Visual Studio中的每次击键时,我们都会创建一个新的SourceText和一个新的Document / Project / Solution快照。我们必须这样做,因为所有功能都依赖于现有的Document实例。

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

答案 1 :(得分:1)

这取决于你想要做什么。

如果您确定知道文本的完成触发器,则可以避免在您认为合适的情况下通过自动触发完成来致电ShouldTriggerCompletion。但过早优化不是自己重新实现它的好理由。 (您将破坏与Roslyn沙箱中播放的其他程序集的兼容性;您可能会错过边缘案例;升级语言时不会升级;等等。)

另外,如果你是来电者,你可能不应该直接调用ShouldTriggerCompletionGetCompletionsAsync似乎更有可能是你想要的。