我在看罗斯林的CompletionService http://source.roslyn.io/#Microsoft.CodeAnalysis.Features/Completion/CompletionService.cs,53, and ShouldTriggerCompletion
定义为
public virtual bool ShouldTriggerCompletion(
SourceText text,
int caretPosition,
CompletionTrigger trigger,
ImmutableHashSet<string> roles = null,
OptionSet options = null
) { … }
where CompletionTrigger
是一个单一的包装char Character
.
这似乎意味着我应该打电话ShouldTriggerCompletion
打字时在每个字符上 - 但这意味着我需要更新SourceText
在每个字符上,分配一个数组TextChange
, a new SourceText
以及可能的其他事物,具体取决于其内部结构。
我对这个 API 的理解正确吗?打字时最有效的使用方法是什么?
Edit:为了澄清一下,我知道我可以事后猜测它,并且只调用它让我们说.
。但我的目标是按照预期的方式使用 API,除了已经提供的优化之外,不进行任何优化。
但这意味着我需要更新每个字符上的 SourceText,它会分配一个 TextChange 数组、一个新的 SourceText 以及可能的其他内容,具体取决于其内部结构
是的,在 Visual Studio 中每次击键时,我们都会创建一个新的 SourceText 和一个新的文档/项目/解决方案快照。我们必须这样做,因为all功能取决于现有的 Document 实例。
对于我们来说,这样的操作是便宜的。 Visual Studio 中的文本编辑器组件已经创建了一个廉价的ITextSnapshot
对于每次编辑,它都是通过非常奇特的数据结构(想想字符串片段的二叉树)来完成的,因此这是尽可能便宜的。当我们在编辑器中为文件创建 SourceTexts 时,我们而是创建我们的SourceText 自己的派生类型 http://source.roslyn.io/#Microsoft.CodeAnalysis.EditorFeatures.Text/Extensions.SnapshotSourceText.cs我们只需将数据请求转发给编辑ITextSnapshot
API。 SourceText 实际上具有以下子集并非巧合ITextSnapshot
的成员,因为我们正是针对这种模式进行设计的!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)