3

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

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

我以为我可以将以前的分类作为分类标签。我使用 IBufferTagAggregatorFactoryService 类做到了这一点。

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

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

溴,加斯帕

编辑:我在该主题中找到了一个很好的文章系列:http ://www.hill30.com/MikeFeingoldBlog/index.php/2009/07/31/django-editor-in-vs-2010-part-1-颜色/

4

1 回答 1

4

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

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

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

  1. 将您的“分类器”实现为ITagger<IClassificationTag>,并从IViewTaggerProvider.
  2. 从an中ITagAggregator<IClassificationTag>获取 an IBufferTagAggregatorFactoryService,但只能获取一次。
  3. IDisposable在您的标记器上实施并在Dispose().
于 2010-07-01T18:15:49.460 回答