void IChunkMarker.ChangeForeColor(MonoTextEditor editor, MonoDevelop.Ide.Editor.Highlighting.ColoredSegment chunk, ref Cairo.Color color)
 {
     //if (forground == null || editor == null) {
     //	return;
     //}
     //int markerStart = Segment.Offset;
     //int markerEnd = Segment.EndOffset;
     //if (chunk.EndOffset <= markerStart || markerEnd <= chunk.Offset)
     //	return;
     //color = forground(editor).Foreground;
 }
Exemple #2
0
        public async Task <HighlightedLine> GetHighlightedLineAsync(IDocumentLine line, CancellationToken cancellationToken)
        {
            var document = workspace.GetDocument(DocumentId);

            if (document == null)
            {
                return(await DefaultSyntaxHighlighting.Instance.GetHighlightedLineAsync(line, cancellationToken));
            }

            // Empirical testing shows that we end up not reallocating the list if we pre-allocate that we have at least 2 times more colored segments than classifiers per line.
            // Current Roslyn API does not allow for a Count getting without iteration, so leave it with a magic number which yields similar results.
            var coloredSegments = new List <ColoredSegment> (32);

            int offset = line.Offset;
            int length = line.Length;
            var span   = new TextSpan(offset, length);


            var classifications = Classifier.GetClassifiedSpans(await document.GetSemanticModelAsync().ConfigureAwait(false), span, workspace, cancellationToken);

            int        lastClassifiedOffsetEnd = offset;
            ScopeStack scopeStack;

            foreach (var curSpan in classifications)
            {
                var start = Math.Max(offset, curSpan.TextSpan.Start);
                if (start < lastClassifiedOffsetEnd)                   // Work around for : https://github.com/dotnet/roslyn/issues/25648
                {
                    continue;
                }
                if (start > lastClassifiedOffsetEnd)
                {
                    scopeStack = userScope;
                    ColoredSegment whitespaceSegment = new ColoredSegment(lastClassifiedOffsetEnd - offset, start - lastClassifiedOffsetEnd, scopeStack);
                    coloredSegments.Add(whitespaceSegment);
                }

                scopeStack = GetStyleScopeStackFromClassificationType(curSpan.ClassificationType);
                ColoredSegment curColoredSegment = new ColoredSegment(start - offset, curSpan.TextSpan.Length, scopeStack);
                coloredSegments.Add(curColoredSegment);

                lastClassifiedOffsetEnd = curSpan.TextSpan.End;
            }

            if (offset + length > lastClassifiedOffsetEnd)
            {
                scopeStack = userScope;
                ColoredSegment whitespaceSegment = new ColoredSegment(lastClassifiedOffsetEnd - offset, offset + length - lastClassifiedOffsetEnd, scopeStack);
                coloredSegments.Add(whitespaceSegment);
            }

            return(new HighlightedLine(line, coloredSegments));
        }
        internal static void ReplaceSegment(List <ColoredSegment> list, ColoredSegment newSegment)
        {
            if (list.Count == 0)
            {
                list.Add(newSegment);
                return;
            }
            int i = list.Count;

            while (i > 0 && list [i - 1].EndOffset > newSegment.Offset)
            {
                i--;
            }
            if (i >= list.Count)
            {
                list.Add(newSegment);
                return;
            }

            int j = i;

            while (j + 1 < list.Count && newSegment.EndOffset > list [j + 1].Offset)
            {
                j++;
            }
            var startItem = list [i];
            var endItem   = list [j];

            list.RemoveRange(i, j - i + 1);
            var lengthAfter = endItem.EndOffset - newSegment.EndOffset;

            if (lengthAfter > 0)
            {
                list.Insert(i, new ColoredSegment(newSegment.EndOffset, lengthAfter, endItem.ScopeStack));
            }

            list.Insert(i, newSegment);
            var lengthBefore = newSegment.Offset - startItem.Offset;

            if (lengthBefore > 0)
            {
                list.Insert(i, new ColoredSegment(startItem.Offset, lengthBefore, startItem.ScopeStack));
            }
        }
Exemple #4
0
        void IChunkMarker.ChangeForeColor(MonoTextEditor editor, MonoDevelop.Ide.Editor.Highlighting.ColoredSegment chunk, ref Cairo.Color color)
        {
            if (Debugger.DebuggingService.IsDebugging)
            {
                return;
            }
            int markerStart = Segment.Offset;
            int markerEnd   = Segment.EndOffset;

            if (chunk.EndOffset <= markerStart || markerEnd <= chunk.Offset)
            {
                return;
            }

            color = new Cairo.Color(
                color.R,
                color.G,
                color.B,
                0.6
                );
        }
Exemple #5
0
        public async Task <HighlightedLine> GetHighlightedLineAsync(IDocumentLine line, CancellationToken cancellationToken)
        {
            List <ColoredSegment> coloredSegments = new List <ColoredSegment> ();

            int offset = line.Offset;
            int length = line.Length;
            var span   = new TextSpan(offset, length);

            var classifications = Classifier.GetClassifiedSpans(await workspace.GetDocument(documentId).GetSemanticModelAsync(), span, workspace, cancellationToken);

            int        lastClassifiedOffsetEnd = offset;
            ScopeStack scopeStack;

            foreach (var curSpan in classifications)
            {
                if (curSpan.TextSpan.Start > lastClassifiedOffsetEnd)
                {
                    scopeStack = defaultScopeStack.Push(EditorThemeColors.UserTypes);
                    ColoredSegment whitespaceSegment = new ColoredSegment(lastClassifiedOffsetEnd - offset, curSpan.TextSpan.Start - lastClassifiedOffsetEnd, scopeStack);
                    coloredSegments.Add(whitespaceSegment);
                }

                string styleName = GetStyleNameFromClassificationType(curSpan.ClassificationType);
                scopeStack = defaultScopeStack.Push(styleName);
                ColoredSegment curColoredSegment = new ColoredSegment(curSpan.TextSpan.Start - offset, curSpan.TextSpan.Length, scopeStack);
                coloredSegments.Add(curColoredSegment);

                lastClassifiedOffsetEnd = curSpan.TextSpan.End;
            }

            if (offset + length > lastClassifiedOffsetEnd)
            {
                scopeStack = defaultScopeStack.Push(EditorThemeColors.UserTypes);
                ColoredSegment whitespaceSegment = new ColoredSegment(lastClassifiedOffsetEnd - offset, offset + length - lastClassifiedOffsetEnd, scopeStack);
                coloredSegments.Add(whitespaceSegment);
            }

            return(new HighlightedLine(line, coloredSegments));
        }
        void IChunkMarker.ChangeForeColor(MonoTextEditor editor, MonoDevelop.Ide.Editor.Highlighting.ColoredSegment chunk, ref Cairo.Color color)
        {
            if (Debugger.DebuggingService.IsDebugging)
            {
                return;
            }
            int markerStart = Segment.Offset;
            int markerEnd   = Segment.EndOffset;

            if (chunk.EndOffset <= markerStart || markerEnd <= chunk.Offset)
            {
                return;
            }
            var    bgc   = (Cairo.Color)SyntaxHighlightingService.GetColor(editor.EditorTheme, EditorThemeColors.Background);
            double alpha = 0.6;

            color = new Cairo.Color(
                color.R * alpha + bgc.R * (1.0 - alpha),
                color.G * alpha + bgc.G * (1.0 - alpha),
                color.B * alpha + bgc.B * (1.0 - alpha)
                );
        }