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; }
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)); } }
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 ); }
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) ); }