Как получить IClassifier для стандартного типа классификации?

У меня есть расширение для редактора MS Visual Studio, которое добавляет подсветку синтаксиса в C ++.

Я хочу убедиться, что предоставленный SnapshotSpan имеет стандартный тип классификации («комментарий»). Есть несколько способов сделать это:

1. Я могу вручную разобрать код C ++, чтобы найти области комментариев. Это последний вариант, который я хочу использовать 🙂

2. Я могу использовать взломать:

this.colorer = buffer.Properties.PropertyList // <-- buffer is a ITextBuffer
.Select(p => p.Value as IClassifier) // Get all classifiers someone put into the properies of the current text buffer
.Where(i => i != null)
.Where(i => i.GetType().FullName == "Microsoft.VisualC.CppColorer") // <-- Hack
.FirstOrDefault();

Теперь я могу использовать этот колорер (который является внутренней реализацией Microsoft классификатора C ++) следующим образом:

this.colorer.GetClassificationSpans(span)
.Where(s => s.ClassificationType.Classification == FormatNames.Comment ||
s.ClassificationType.Classification == FormatNames.XmlDocComment)

Тада! У меня есть информация о комментариях в текстовом буфере. Как вы понимаете, это взлом, и я хочу избежать этого 🙂

3. Я могу попытаться (как-то) получить классификатор для стандартного типа классификации (например, для «комментария»).


Итак, мой вопрос: Можно ли получить IClassifier по имени типа классификации?

1

Решение

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

1

Другие решения

Вы можете импортировать IClassifierAggregatorService:

[Import]
internal IClassifierAggregatorService classifierAggregatorService = null;

А затем перебрать ClassificationSpan чтобы проверить, что каждый диапазон классификации имеет тип "comment":

IClassifier classifier = classifierAggregatorService.GetClassifier(textBuffer);
IList<ClassificationSpan> classificationSpanList = _classifier.GetClassificationSpans(span);
foreach (ClassificationSpan classificationSpan in classificationSpanList)
{
if (classificationSpan.ClassificationType.IsOfType("comment"))
{
// ...
}
}

Как альтернатива получению IClassifierAggregatorServiceВы можете получить ITagAggregator<IClassificationTag> от IBufferTagAggregatorFactoryService, Особенно полезно, если вы хотите добавить классификацию в зависимости от предыдущей классификации (см. этот ответ).

1

По вопросам рекламы [email protected]