我正在查看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,除了已经提供的优化之外没有任何优化。
答案 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沙箱中播放的其他程序集的兼容性;您可能会错过边缘案例;升级语言时不会升级;等等。)
另外,如果你是来电者,你可能不应该直接调用ShouldTriggerCompletion
:GetCompletionsAsync
似乎更有可能是你想要的。