Раскраска синтаксиса VS2010: как получить предыдущий тип классификации - PullRequest
3 голосов
/ 01 июля 2010

Я пытаюсь поиграть с новыми возможностями синтаксической раскраски VS2010 на основе образца расцветки diff Ноа Ричардса.Цель состоит в том, чтобы создать синтаксическую раскраску для 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/

1 Ответ

4 голосов
/ 01 июля 2010

По сути, вам придется помнить состояние самостоятельно.Большинство языковых служб VS хранят файл cookie состояния для начала каждой строки, которую они обновляют при изменении текста.

В любой момент получение классификаций (через агрегатор классификаторов или агрегатор тегов) всегда приводит к вызовутекущие классификаторы / теги, поэтому он не будет возвращать кэшированное состояние любого типа (или возвращенные «последние» классификации).Редактор на самом деле не кеширует эту информацию, а просто действует как тупой проход для информации, которую ваш классификатор предоставляет видимым строкам, которые форматируются.

Кроме того, если вы делаете это из классификатора (предоставленноголибо IClassifierProvider, либо ITaggerProvider), вы настраиваете себя на некоторую неприятную рекурсию, особенно если ваш классификатор отвечает на GetClassificationSpans, вызывая агрегатор (который затем вызывает ваш классификатор для более раннего текста и т. д.).Если вашему классификатору требуется для правильной работы других классификаций (а не собственных классификаций), единственный безопасный способ написать это:

  1. Реализуйте свой "классификатор" какITagger<IClassificationTag> и предоставьте его из IViewTaggerProvider.
  2. Получите ITagAggregator<IClassificationTag> из IBufferTagAggregatorFactoryService, но только один раз.
  3. Реализуйте IDisposable на вашем тэгере и утилизируйтеагрегатор тегов в Dispose().
...