Раскраска синтаксиса VS2010: как получить предыдущий тип классификации

Я пытаюсь поиграть с новыми возможностями окраски синтаксиса VS2010 на основе образца окраски diff Ноа Ричардса. Цель состоит в том, чтобы создать окраску синтаксиса для SpecFlow (http://www.specflow.org).

В моем случае поиск элементов синтаксиса довольно сложный и не на уровне строк. Поэтому, когда я реализую GetClassificationSpans, я не хочу повторно анализировать весь файл, а скорее беру состояние начала измененного текста и анализирую содержимое с этого момента.

Я думал, что смогу получить предыдущие классификации как ClassificationTags. Я сделал это, используя класс IBufferTagAggregatorFactoryService.

Это работает, но я не уверен, что это лучший способ. Должен ли я создавать только агрегатор тегов для всего класса классификатора или я могу создавать его каждый раз, когда вызывается GetClassificationSpans? Должен ли я создать специальный тег для запоминания состояния синтаксического анализа?

Может быть, это в любом случае не правильный путь, меня также интересуют другие предложения.

Бр, Гаспар

Изменить: я нашел хорошую серию статей в теме: http://www.hill30.com/MikeFeingoldBlog/index.php/2009/07/31/django-editor-in-vs-2010-part-1-colors/


person Gaspar Nagy    schedule 01.07.2010    source источник


Ответы (1)


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

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

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

  1. Реализуйте свой «классификатор» как ITagger<IClassificationTag> и предоставьте его из IViewTaggerProvider.
  2. Возьмите ITagAggregator<IClassificationTag> из IBufferTagAggregatorFactoryService, но только один раз.
  3. Внедрите IDisposable в свой тегировщик и разместите агрегатор тегов в Dispose().
person Noah Richards    schedule 01.07.2010
comment
спасибо за ответ! о государственных куках: есть ли для этого встроенная инфраструктура или я просто буду хранить их в своей модели? - person Gaspar Nagy; 02.07.2010
comment
В старых интерфейсах (IVsColorizer) был, а в новых нет, так что придется писать свою модель. Дайте мне знать, если у вас возникнут какие-либо проблемы, поскольку мне пришлось написать такую ​​​​модель при регулировке этих старых IVsColorizer, чтобы они работали с классификацией. - person Noah Richards; 02.07.2010