internal GlslClassifier(ITextBuffer textBuffer, SyntaxColorParser parser, ILogger logger) { if (textBuffer is null) { throw new ArgumentNullException(nameof(textBuffer)); } if (parser is null) { throw new ArgumentNullException(nameof(parser)); } if (logger is null) { throw new ArgumentNullException(nameof(logger)); } var observableSnapshot = Observable.Return(textBuffer.CurrentSnapshot).Concat( Observable.FromEventPattern <TextContentChangedEventArgs>(h => textBuffer.Changed += h, h => textBuffer.Changed -= h) .Select(e => e.EventArgs.After)); parser.Changed += _ => UpdateSpans(); void UpdateSpans() { #if DEBUG var time = Stopwatch.StartNew(); #endif var snapshotSpan = new SnapshotSpan(textBuffer.CurrentSnapshot, 0, textBuffer.CurrentSnapshot.Length); var spans = parser.CalculateSpans(snapshotSpan); #if DEBUG logger.Log($"{time.ElapsedTicks * 1e3f / Stopwatch.Frequency}ms : tokens={spans.Count}"); #endif this.spans = spans; ClassificationChanged?.Invoke(this, new ClassificationChangedEventArgs(snapshotSpan)); } observableSnapshot .Throttle(TimeSpan.FromSeconds(0.3f)) .Subscribe(_ => UpdateSpans()); //UpdateSpans(new SnapshotSpan(textBuffer.CurrentSnapshot, 0, textBuffer.CurrentSnapshot.Length)); //textBuffer.Changed += (s, a) => //{ // // ignore not up-to-date versions // if (a.After != textBuffer.CurrentSnapshot) return; // var start = a.Changes.Min(change => Math.Min(change.OldPosition, change.NewPosition)); // var end = a.Changes.Max(change => Math.Max(change.OldEnd, change.NewEnd)); // var length = Math.Min(end - start, textBuffer.CurrentSnapshot.Length); // var changeSpan = new SnapshotSpan(textBuffer.CurrentSnapshot, start, length); // var changeText = changeSpan.GetText(); // //if(changeText.Contains('{') || changeText.Contains('}') || changeText.Contains('*') || ) // //UpdateSpans(changeSpan); // UpdateSpans(new SnapshotSpan(textBuffer.CurrentSnapshot, 0, textBuffer.CurrentSnapshot.Length)); //}; }
public GlslClassifierProvider(IClassificationTypeRegistryService classificationTypeRegistry, ILogger logger, IUserKeywords userKeywords) { if (classificationTypeRegistry is null) { throw new System.ArgumentNullException(nameof(classificationTypeRegistry)); } if (userKeywords is null) { throw new System.ArgumentNullException(nameof(userKeywords)); } this.logger = logger ?? throw new System.ArgumentNullException(nameof(logger)); parser = new SyntaxColorParser(classificationTypeRegistry, userKeywords); }