По сути, вам придется помнить состояние самостоятельно.Большинство языковых служб VS хранят файл cookie состояния для начала каждой строки, которую они обновляют при изменении текста.
В любой момент получение классификаций (через агрегатор классификаторов или агрегатор тегов) всегда приводит к вызовутекущие классификаторы / теги, поэтому он не будет возвращать кэшированное состояние любого типа (или возвращенные «последние» классификации).Редактор на самом деле не кеширует эту информацию, а просто действует как тупой проход для информации, которую ваш классификатор предоставляет видимым строкам, которые форматируются.
Кроме того, если вы делаете это из классификатора (предоставленноголибо IClassifierProvider, либо ITaggerProvider), вы настраиваете себя на некоторую неприятную рекурсию, особенно если ваш классификатор отвечает на GetClassificationSpans
, вызывая агрегатор (который затем вызывает ваш классификатор для более раннего текста и т. д.).Если вашему классификатору требуется для правильной работы других классификаций (а не собственных классификаций), единственный безопасный способ написать это:
- Реализуйте свой "классификатор" как
ITagger<IClassificationTag>
и предоставьте его из IViewTaggerProvider
. - Получите
ITagAggregator<IClassificationTag>
из IBufferTagAggregatorFactoryService
, но только один раз. - Реализуйте
IDisposable
на вашем тэгере и утилизируйтеагрегатор тегов в Dispose()
.