Sometimes you just want to see the data in a C# file:
using System; using System.Collections.Generic; using System.ComponentModel.Composition; using System.Linq; using Microsoft.VisualStudio.Utilities; namespace Microsoft.VisualStudio.Text.Classification { public static class Definitions { [Export(typeof(ClassificationTypeDefinition))] [Name("hilite-data")] internal static ClassificationTypeDefinition CTD; [Export(typeof(EditorFormatDefinition))] [ClassificationType(ClassificationTypeNames = "hilite-data")] [Name("hilite-data")] [DisplayName("Highlight Data")] [UserVisible(true)] [Order(Before = Priority.High)] internal sealed class CFD : ClassificationFormatDefinition { public CFD() { this.ForegroundColor = System.Windows.Media.Colors.LightGray; } } public static bool IsToBeHilited(this string classification) { var hilites = new[] { "string", "comment" }; return hilites.Contains(classification.ToLower()); } } [Export(typeof(IClassifierProvider))] [ContentType("CSharp")] internal sealed class HiliteDataClassifierProvider : IClassifierProvider { [Import] IClassificationTypeRegistryService ctrs = null; [Import] internal IClassifierAggregatorService AggregatorService = null; internal static bool ignoreRequest = false; public IClassifier GetClassifier(ITextBuffer textBuffer) { if (ignoreRequest) return null; try { ignoreRequest = true; return textBuffer.Properties.GetOrCreateSingletonProperty( () => new HiliteDataClassifier(AggregatorService.GetClassifier(textBuffer), ctrs)); } finally { ignoreRequest = false; } } } internal sealed class HiliteDataClassifier : IClassifier { private IClassifier aggregator; private IClassificationTypeRegistryService ctrs; public HiliteDataClassifier(IClassifier aggregator, IClassificationTypeRegistryService ctrs) { this.aggregator = aggregator; this.ctrs = ctrs; } public IList<ClassificationSpan> GetClassificationSpans(SnapshotSpan span) { var classifiedSpans = from cs in aggregator.GetClassificationSpans(span) let c = cs.ClassificationType.Classification where c.IsToBeHilited() select cs.Span; NormalizedSnapshotSpanCollection ignored = new NormalizedSnapshotSpanCollection(classifiedSpans); NormalizedSnapshotSpanCollection request = new NormalizedSnapshotSpanCollection(span); var spansToIgnore = NormalizedSnapshotSpanCollection.Difference(request, ignored); IClassificationType ct = ctrs.GetClassificationType("hilite-data"); return spansToIgnore.Select(s => new ClassificationSpan(s, ct)).ToList(); } public event EventHandler<ClassificationChangedEventArgs> ClassificationChanged; } }
This is for my own consumption (being a blog and what not); use it at your own peril.