我正在查看 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/