У меня есть расширение для редактора 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 по имени типа классификации?
Похоже, что нет официального способа сделать это. Поэтому я сам реализовал классификатор для комментариев к коду.
Вы можете импортировать 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
, Особенно полезно, если вы хотите добавить классификацию в зависимости от предыдущей классификации (см. этот ответ).