首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VS2010语法着色:如何获取以前的分类类型

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

Stack Overflow用户
提问于 2010-07-01 14:46:24
回答 1查看 1.2K关注 0票数 3

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

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

我想我可以得到之前的分类为ClassificationTags。我使用IBufferTagAggregatorFactoryService类做到了这一点。

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

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

Br,Gaspar

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-02 02:15:49

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

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

此外,如果您从分类器(由IClassifierProvider或ITaggerProvider提供)执行此操作,您将陷入一些糟糕的递归,特别是当您的分类器通过调用聚合器来响应GetClassificationSpans时(聚合器随后会回调到您的分类器以获取一些较早的文本,等等)。如果您的分类器需要使用其他分类才能正常工作(而不是它自己的分类),那么编写它的唯一安全方法是:

  1. 将您的“分类器”实现为ITagger<IClassificationTag>,并从IViewTaggerProvider.
  2. Grab提供它来自IBufferTagAggregatorFactoryService的IDisposable,但仅在您的标记器上提供标签聚合器,并在Dispose().

中处置标签聚合器

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3155598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档