VS2010语法着色:如何获取以前的分类类型

时间:2010-07-01 06:46:24

标签: visual-studio-2010 mef visual-studio-sdk

我正在尝试使用基于Noah Richards的diff着色样本的VS2010的新语法着色功能。目标是为SpecFlow(http://www.specflow.org)创建语法着色。

就我而言,找到语法元素相当复杂而不是行级。因此,当我实现GetClassificationSpans时,我不想重新解析整个文件,而是采取更改文本开头的状态并从该点解析内容。

我认为我可以将以前的分类作为ClassificationTags。我是使用IBufferTagAggregatorFactoryService类完成的。

它有效,但我不确定这是否是最好的方法。我应该只为整个分类器类创建标签聚合器,还是每次调用GetClassificationSpans时都可以创建它?我应该创建一个特殊的标签来记住解析状态吗?

也许这不是正确的方法,我也对其他建议感兴趣。

BR, 加斯帕尔

编辑:我在主题中发现了一篇很好的文章系列:http://www.hill30.com/MikeFeingoldBlog/index.php/2009/07/31/django-editor-in-vs-2010-part-1-colors/

1 个答案:

答案 0 :(得分:4)

基本上,你必须自己记住这个状态。大多数VS语言服务都会为文本更改时更新的每一行的开头保留一个状态cookie。

在任何时候,获取分类(通过分类器聚合器或标记聚合器)将始终导致对当前分类器/标记器的调用,因此它不会返回任何类型的缓存状态(或“最后”)归类分类)。编辑器并没有真正缓存这些信息,只是对分类器提供给被格式化的可见行的信息进行愚蠢的传递。

另外,如果你是从分类器(由IClassifierProvider或ITaggerProvider提供)中进行的,那么你正在设置一些讨厌的递归,特别是如果你的分类器通过调用聚合器来响应GetClassificationSpans(然后回调你的分类器中的一些早期文本,等等。如果您的分类器需要使用其他分类才能正常工作(而不是自己的分类),那么唯一安全的方法就是:

  1. 将您的“分类器”实施为ITagger<IClassificationTag>,并通过IViewTaggerProvider提供。
  2. ITagAggregator<IClassificationTag>抓取IBufferTagAggregatorFactoryService,但只抓一次。
  3. 在您的代码机上实施IDisposable并将代码聚合器置于Dispose()