コード例 #1
0
ファイル: GlslClassifier.cs プロジェクト: danielscherzer/GLSL
        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));
            //};
        }
コード例 #2
0
        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);
        }