/// <summary> Add object to cache, optionally adding extra memory tracking </summary>
        public void AddParsedObject(AXmlObject obj, int?maxTouchedLocation)
        {
            if (!(obj.Length > 0 || obj is AXmlDocument))
            {
                AXmlParser.Assert(false, string.Format(CultureInfo.InvariantCulture, "Invalid object {0}.  It has zero length.", obj));
            }
//			// Expensive check
//			if (obj is AXmlContainer) {
//				int objStartOffset = obj.StartOffset;
//				int objEndOffset = obj.EndOffset;
//				foreach(AXmlObject child in ((AXmlContainer)obj).Children) {
//					AXmlParser.Assert(objStartOffset <= child.StartOffset && child.EndOffset <= objEndOffset, "Wrong nesting");
//				}
//			}
            segments.Add(obj);
            AddSyntaxErrorsOf(obj);
            obj.IsCached = true;
            if (maxTouchedLocation != null)
            {
                // location is assumed to be read so the range ends at (location + 1)
                // For example eg for "a_" it is (0-2)
                TouchedRange range = new TouchedRange()
                {
                    StartOffset     = obj.StartOffset,
                    EndOffset       = maxTouchedLocation.Value + 1,
                    TouchedByObject = obj
                };
                segments.Add(range);
                AXmlParser.Log("{0} touched range ({1}-{2})", obj, range.StartOffset, range.EndOffset);
            }
        }
Exemple #2
0
        public TextMarker TryCreate(int startOffset, int length)
        {
            if (_markers == null)
            {
                throw new InvalidOperationException("Cannot create a marker when not attached to a document");
            }

            var textLength = _document.TextLength;

            if (startOffset < 0 || startOffset > textLength)
            {
                return(null);
            }

            if (length < 0 || startOffset + length > textLength)
            {
                return(null);
            }

            var marker = new TextMarker(this, startOffset, length);

            _markers.Add(marker);

            return(marker);
        }
Exemple #3
0
        private void ModifySelectedLines(Action <int, int> action)
        {
            var selection = TextArea.Selection;

            var startLine = Document.GetLineByOffset(CaretOffset).LineNumber;
            var endLine   = startLine;

            if (selection.Length > 0)
            {
                startLine = selection.StartPosition.Line;
                endLine   = selection.EndPosition.Line;
            }

            var selectionSegment = GetSelectionSegment();
            var caretSegment     = new TextSegment()
            {
                StartOffset = CaretOffset, EndOffset = CaretOffset
            };

            var anchors = new TextSegmentCollection <TextSegment>(Document);

            anchors.Add(selectionSegment);
            anchors.Add(caretSegment);

            action(startLine, endLine);

            SetSelection(selectionSegment);

            CaretOffset = caretSegment.StartOffset;

            Focus();
        }
        public void Add(TextMarker m)
        {
            if (markers.Contains(m))
            {
                return;
            }

            markers.Add(m);
        }
Exemple #5
0
        public void WriteDefinition(string text, object definition, TextTokenType tokenType, bool isLocal)
        {
            WriteIndent();
            int start = this.TextLength;

            Append(tokenType, text);
            int end = this.TextLength;

            this.DefinitionLookup.AddDefinition(definition, this.TextLength);
            references.Add(new ReferenceSegment {
                StartOffset = start, EndOffset = end, Reference = definition, IsLocal = isLocal, IsLocalTarget = true
            });
        }
Exemple #6
0
        private void LanguageService_DiagnosticsUpdated(object sender, DiagnosticsUpdatedEventArgs e)
        {
            if (e.AssociatedSourceFile == SourceFile)
            {
                _diagnosticMarkersRenderer?.RemoveAll(marker => Equals(marker.Tag, e.Tag));

                var collection = new TextSegmentCollection <Diagnostic>(Document);

                foreach (var diagnostic in e.Diagnostics)
                {
                    collection.Add(diagnostic);
                }

                if (e.Kind == DiagnosticsUpdatedKind.DiagnosticsCreated)
                {
                    _diagnosticMarkersRenderer?.SetDiagnostics(e.Tag, collection);

                    if (e.DiagnosticHighlights != null)
                    {
                        _textColorizer.SetTransformations(e.Tag, e.DiagnosticHighlights);
                    }
                }

                _contextActionsRenderer.OnDiagnosticsUpdated();
            }

            _shell.UpdateDiagnostics(e);

            TextArea.TextView.Redraw();
        }
        public void Create(int offset, int length, string message)
        {
            var marker = new ErrorTextMarker(offset, length, message, Colors.Red);

            markers.Add(marker);
            textEditor.TextArea.TextView.Redraw(marker);
        }
Exemple #8
0
        public void SetTransformations(SyntaxHighlightDataList highlightData)
        {
            Dispatcher.UIThread.InvokeAsync(() =>
            {
                var transformations = new TextSegmentCollection <TextTransformation>(document);

                foreach (var transform in highlightData)
                {
                    if (transform.Type != HighlightType.None)
                    {
                        transformations.Add(new TextTransformation
                        {
                            Foreground  = GetBrush(transform.Type),
                            StartOffset = transform.Start,
                            EndOffset   = transform.Start + transform.Length
                        });
                    }
                }

                TextTransformations = transformations;

                if (DataChanged != null)
                {
                    DataChanged(this, new EventArgs());
                }
            });
        }
        private void ProcessTokens(int lineNumber, List <TMToken> tokens)
        {
            for (int i = 0; i < tokens.Count; i++)
            {
                var token     = tokens[i];
                var nextToken = (i + 1) < tokens.Count ? tokens[i + 1] : null;

                var startIndex = token.StartIndex;
                var endIndex   = nextToken?.StartIndex ?? _model.GetLines().GetLineLength(lineNumber - 1);

                if (startIndex >= endIndex || token.Scopes == null || token.Scopes.Count == 0)
                {
                    continue;
                }

                var lineOffset = _document.GetLineByNumber(lineNumber).Offset;

                foreach (var themeRule in _theme.Match(token.Scopes))
                {
                    if (themeRule.foreground > 0 && _brushes.ContainsKey(themeRule.foreground))
                    {
                        _transformations.Add(new ForegroundTextTransformation(this, lineOffset + startIndex,
                                                                              lineOffset + endIndex, themeRule.foreground));

                        break;
                    }
                }
            }
        }
Exemple #10
0
        public TextMarker TryCreate(int startOffset, int length)
        {
            if (_markers == null)
            {
                throw new InvalidOperationException("Cannot create a marker when not attached to a document");
            }

            var textLength = _document.TextLength;

            if (startOffset < 0 || startOffset > textLength)
            {
                return(null);
            }
            //throw new ArgumentOutOfRangeException(nameof(startOffset), startOffset, "Value must be between 0 and " + textLength);
            if (length < 0 || startOffset + length > textLength)
            {
                return(null);
            }
            //throw new ArgumentOutOfRangeException(nameof(length), length, "length must not be negative and startOffset+length must not be after the end of the document");

            var marker = new TextMarker(this, startOffset, length);

            _markers.Add(marker);
            return(marker);
        }
        private void GenerateDiagnostics(IEnumerable <ClangDiagnostic> clangDiagnostics, ClangTranslationUnit translationUnit, IProject project, TextSegmentCollection <Diagnostic> result)
        {
            foreach (var diagnostic in clangDiagnostics)
            {
                if (diagnostic.Location.IsFromMainFile)
                {
                    var diag = new Diagnostic
                    {
                        Project     = project,
                        StartOffset = diagnostic.Location.FileLocation.Offset,
                        Line        = diagnostic.Location.FileLocation.Line,
                        Spelling    = diagnostic.Spelling,
                        File        = diagnostic.Location.FileLocation.File.FileName,
                        Level       = (DiagnosticLevel)diagnostic.Severity
                    };

                    var cursor = translationUnit.GetCursor(diagnostic.Location);

                    var tokens = translationUnit.Tokenize(cursor.CursorExtent);

                    foreach (var token in tokens.Tokens)
                    {
                        if (token.Location == diagnostic.Location)
                        {
                            diag.EndOffset = diag.StartOffset + token.Spelling.Length;
                        }
                    }

                    result.Add(diag);
                    tokens.Dispose();
                }
            }
        }
        public ITextMarker Create(int startOffset, int length)
        {
            if (markers == null)
            {
                throw new InvalidOperationException("Cannot create a marker when not attached to a document");
            }

            var textLength = document.TextLength;

            if (startOffset < 0 || startOffset > textLength)
            {
                throw new ArgumentOutOfRangeException("startOffset", startOffset,
                                                      "Value must be between 0 and " + textLength);
            }

            if (length < 0 || startOffset + length > textLength)
            {
                throw new ArgumentOutOfRangeException("length", length,
                                                      "length must not be negative and startOffset+length must not be after the end of the document");
            }

            var m = new TextMarker(this, startOffset, length);

            markers.Add(m);
            // no need to mark segment for redraw: the text marker is invisible until a property is set
            return(m);
        }
        public ITextMarker Create(int startOffset, int length)
        {
            TextMarker m = new TextMarker(this, startOffset, length);

            markers.Add(m);
            // no need to mark segment for redraw: the text marker is invisible until a property is set
            return(m);
        }
Exemple #14
0
        public void AddMarker(int offset, int length, string message)
        {
            var m = new TextMarker(offset, length);

            _markers.Add(m);
            m.ToolTip = message;
            Redraw(m);
        }
Exemple #15
0
        public void Draw(TextView textView, DrawingContext drawingContext)
        {
            if (Issues == null)
            {
                return;
            }

            var segments = new TextSegmentCollection <IssueMarker>();

            foreach (var issue in Issues)
            {
                segments.Add(new IssueMarker(Theme, issue));
            }

            var visualLines = textView.VisualLines;

            if (visualLines.Count == 0)
            {
                return;
            }
            int viewStart = visualLines.First().FirstDocumentLine.Offset;
            int viewEnd   = visualLines.Last().LastDocumentLine.EndOffset;

            foreach (var marker in segments.FindOverlappingSegments(viewStart, viewEnd - viewStart))
            {
                var brush   = marker.Brush;
                var usedPen = new Pen(brush, 1);
                usedPen.Freeze();
                if (brush == null)
                {
                    continue;
                }

                foreach (var r in BackgroundGeometryBuilder.GetRectsForSegment(textView, marker))
                {
                    var startPoint = r.BottomLeft;
                    var endPoint   = r.BottomRight;

                    double offset = 2.5;

                    int count = Math.Max((int)((endPoint.X - startPoint.X) / offset) + 1, 4);

                    var geometry = new StreamGeometry();

                    using (StreamGeometryContext ctx = geometry.Open())
                    {
                        ctx.BeginFigure(startPoint, false, false);
                        ctx.PolyLineTo(CreatePoints(startPoint, offset, count), true, false);
                    }

                    geometry.Freeze();


                    drawingContext.DrawGeometry(Brushes.Transparent, usedPen, geometry);
                }
            }
        }
        public void Create(int offset, int length, string message)
        {
            var m = new TextMarker(offset, length);

            markers.Add(m);
            m.MarkerColor = Colors.Red;
            m.ToolTip     = message;
            Redraw(m);
        }
Exemple #17
0
    public void Create(int offset, int length, Action <TextMarker> func)
    {
        var m = new TextMarker(offset, length);

        func?.Invoke(m);

        markers.Add(m);

        Redraw(m);
    }
Exemple #18
0
        /// <summary>
        /// Creates a folding for the specified text section.
        /// </summary>
        public FoldingSection CreateFolding(int startOffset, int endOffset)
        {
            if (startOffset >= endOffset)
            {
                throw new ArgumentException("startOffset must be less than endOffset");
            }
            FoldingSection fs = new FoldingSection(this, startOffset, endOffset);

            foldings.Add(fs);
            textView.Redraw();
            return(fs);
        }
Exemple #19
0
        public void WriteReference(Decompiler.Disassembler.OpCodeInfo opCode)
        {
            WriteIndent();
            int start = this.TextLength;

            b.Append(opCode.Name);
            int end = this.TextLength;

            references.Add(new ReferenceSegment {
                StartOffset = start, EndOffset = end, Reference = opCode
            });
        }
Exemple #20
0
        private void GenerateDiagnostics(IEnumerable <ClangDiagnostic> clangDiagnostics, ClangTranslationUnit translationUnit, IProject project, TextSegmentCollection <Diagnostic> result, TextMarkerService service)
        {
            foreach (var diagnostic in clangDiagnostics)
            {
                if (diagnostic.Location.IsFromMainFile)
                {
                    var diag = new Diagnostic
                    {
                        Project     = project,
                        StartOffset = diagnostic.Location.FileLocation.Offset,
                        Line        = diagnostic.Location.FileLocation.Line,
                        Spelling    = diagnostic.Spelling,
                        File        = diagnostic.Location.FileLocation.File.FileName,
                        Level       = (DiagnosticLevel)diagnostic.Severity
                    };

                    var cursor = translationUnit.GetCursor(diagnostic.Location);

                    var tokens = translationUnit.Tokenize(cursor.CursorExtent);

                    foreach (var token in tokens.Tokens)
                    {
                        if (token.Location == diagnostic.Location)
                        {
                            diag.EndOffset = diag.StartOffset + token.Spelling.Length;
                        }
                    }

                    result.Add(diag);
                    tokens.Dispose();

                    Color markerColor;

                    switch (diag.Level)
                    {
                    case DiagnosticLevel.Error:
                    case DiagnosticLevel.Fatal:
                        markerColor = Color.FromRgb(253, 45, 45);
                        break;

                    case DiagnosticLevel.Warning:
                        markerColor = Color.FromRgb(255, 207, 40);
                        break;

                    default:
                        markerColor = Color.FromRgb(0, 42, 74);
                        break;
                    }

                    service.Create(diag.StartOffset, diag.Length, diag.Spelling, markerColor);
                }
            }
        }
Exemple #21
0
        public void WriteReference(string text, object reference)
        {
            WriteIndent();
            int start = this.TextLength;

            b.Append(text);
            int end = this.TextLength;

            references.Add(new ReferenceSegment {
                StartOffset = start, EndOffset = end, Reference = reference
            });
        }
Exemple #22
0
        public void WriteReference(Decompiler.Disassembler.OpCodeInfo opCode, bool omitSuffix = false)
        {
            WriteIndent();
            int start = this.TextLength;

            if (omitSuffix)
            {
                int lastDot = opCode.Name.LastIndexOf('.');
                if (lastDot > 0)
                {
                    b.Append(opCode.Name.Remove(lastDot + 1));
                }
            }
            else
            {
                b.Append(opCode.Name);
            }
            int end = this.TextLength - 1;

            references.Add(new ReferenceSegment {
                StartOffset = start, EndOffset = end, Reference = opCode
            });
        }
Exemple #23
0
        public void SetTransformations(SyntaxHighlightDataList highlightData)
        {
            Dispatcher.UIThread.InvokeAsync(() =>
            {
                var transformations = new TextSegmentCollection <TextTransformation>(document);

                foreach (var transform in highlightData)
                {
                    if (transform.Type != HighlightType.None)
                    {
                        if (transform is LineColumnSyntaxHighlightingData)
                        {
                            var trans = transform as LineColumnSyntaxHighlightingData;

                            transformations.Add(new TextTransformation
                            {
                                Foreground  = GetBrush(transform.Type),
                                StartOffset = document.GetOffset(trans.StartLine, trans.StartColumn),
                                EndOffset   = document.GetOffset(trans.EndLine, trans.EndColumn)
                            });
                        }
                        else
                        {
                            transformations.Add(new TextTransformation
                            {
                                Foreground  = GetBrush(transform.Type),
                                StartOffset = transform.Start,
                                EndOffset   = transform.Start + transform.Length
                            });
                        }
                    }
                }

                TextTransformations = transformations;
            });
        }
Exemple #24
0
        public ITextMarker Create(int startOffset, int length)
        {
            int textLength = codeEditor.Document.TextLength;

            if (startOffset < 0 || startOffset > textLength)
            {
                throw new ArgumentOutOfRangeException("startOffset", startOffset, "Value must be between 0 and " + textLength);
            }
            if (length < 0 || startOffset + length > textLength)
            {
                throw new ArgumentOutOfRangeException("length", length, "length must not be negative and startOffset+length must not be after the end of the document");
            }

            TextMarker m = new TextMarker(this, startOffset, length);

            markers.Add(m);
            // no need to mark segment for redraw: the text marker is invisible until a property is set
            return(m);
        }
Exemple #25
0
        public void UnComment()
        {
            if (Model?.LanguageService != null && Model.Editor != null)
            {
                var selection = GetSelection();

                if (selection != null)
                {
                    var anchors = new TextSegmentCollection <TextSegment>(TextDocument);
                    anchors.Add(selection);

                    CaretIndex = Model.LanguageService.UnComment(TextDocument, selection, CaretIndex);

                    SetSelection(selection);
                }

                Model.Editor.Focus();
            }
        }
Exemple #26
0
        private void ProcessTokens(int lineNumber, List <TMToken> tokens)
        {
            for (int i = 0; i < tokens.Count; i++)
            {
                var token     = tokens[i];
                var nextToken = (i + 1) < tokens.Count ? tokens[i + 1] : null;

                var startIndex = token.StartIndex;
                var endIndex   = nextToken?.StartIndex ?? _model.GetLines().GetLineLength(lineNumber - 1);

                if (startIndex >= endIndex || token.Scopes == null || token.Scopes.Count == 0)
                {
                    continue;
                }

                var lineOffset = _document.GetLineByNumber(lineNumber).Offset;

                int foreground = 0;
                int background = 0;
                int fontStyle  = 0;

                foreach (var themeRule in _theme.Match(token.Scopes))
                {
                    if (foreground == 0 && themeRule.foreground > 0)
                    {
                        foreground = themeRule.foreground;
                    }

                    if (background == 0 && themeRule.background > 0)
                    {
                        background = themeRule.background;
                    }

                    if (fontStyle == 0 && themeRule.fontStyle > 0)
                    {
                        fontStyle = themeRule.fontStyle;
                    }
                }

                _transformations.Add(new ForegroundTextTransformation(this, _exceptionHandler, lineOffset + startIndex,
                                                                      lineOffset + endIndex, foreground, background, fontStyle));
            }
        }
        public void SetTransformations(SyntaxHighlightDataList highlightData)
        {
            Dispatcher.UIThread.InvokeAsync(() =>
            {
                var transformations = new TextSegmentCollection<TextTransformation>(document);

                foreach (var transform in highlightData)
                {
                    if (transform.Type != HighlightType.None)
                    {
                        if (transform is LineColumnSyntaxHighlightingData)
                        {
                            var trans = transform as LineColumnSyntaxHighlightingData;

                            transformations.Add(new TextTransformation
                            {
                                Foreground = GetBrush(transform.Type),
                                StartOffset = document.GetOffset(trans.StartLine, trans.StartColumn),
                                EndOffset = document.GetOffset(trans.EndLine, trans.EndColumn)
                            });
                        }
                        else
                        {
                            transformations.Add(new TextTransformation
                            {
                                Foreground = GetBrush(transform.Type),
                                StartOffset = transform.Start,
                                EndOffset = transform.Start + transform.Length
                            });
                        }
                    }
                }

                TextTransformations = transformations;

                if (DataChanged != null)
                {
                    DataChanged(this, new EventArgs());
                }
            });
        }
Exemple #28
0
        private void TransformSelectedLines(Action <IDocumentLine> transformLine)
        {
            var selection = GetSelectionAsSegment();
            var lines     = VisualLineGeometryBuilder.GetLinesForSegmentInDocument(TextDocument, selection);

            if (lines.Count() > 0)
            {
                var anchors = new TextSegmentCollection <TextSegment>(TextDocument);

                anchors.Add(selection);

                TextDocument.BeginUpdate();

                foreach (var line in lines)
                {
                    transformLine(line);
                }

                TextDocument.EndUpdate();

                SetSelection(selection);
            }
        }
        private void TransformSelectedLines(Action<IDocumentLine> transformLine)
        {
            var selection = GetSelectionAsSegment();
            var lines = VisualLineGeometryBuilder.GetLinesForSegmentInDocument(TextDocument, selection);

            if (lines.Count() > 0)
            {
                var anchors = new TextSegmentCollection<TextSegment>(TextDocument);

                anchors.Add(selection);
                // TODO Add an achor to the caret index...

                TextDocument.BeginUpdate();

                foreach (var line in lines)
                {
                    transformLine(line);
                }

                TextDocument.EndUpdate();

                SetSelection(selection);
            }
        }
 public void InsertionPossibleBeforeReadOnlySegment()
 {
     segments.Add(new TextSegment {
         StartOffset = 10, EndOffset = 15
     });
     Assert.IsTrue(provider.CanInsert(5));
 }
Exemple #31
0
 public void AddSegment(DiffSegment segment)
 {
     diffSegments.Add(segment);
 }
Exemple #32
0
        internal IEnumerable <ISearchResult> Search(SearchQuery query, int offset, int length)
        {
            // Clear previous search results.
            _searchResults.Clear();

            // Determine the start offset.
            int caretOffset = 0;

            if (query.IsRelative)
            {
                var textEditor = this.GetLastActiveTextEditor();
                if (textEditor != null)
                {
                    caretOffset = textEditor.SelectionStart;  // SelectionStart returns CaretOffsets if nothing is selected.
                }
            }

            if (caretOffset < offset)
            {
                caretOffset = offset;
            }
            else if (caretOffset > offset + length)
            {
                caretOffset = offset + length;
            }

            // Perform search.
            var searchResults = GetSearchResults(query, offset, length);

            if (searchResults == null || searchResults.Count == 0)
            {
                return(Enumerable.Empty <ISearchResult>());
            }

            // Save search results in TextSegmentCollection. (The TextSegmentCollection will
            // automatically update the offsets of the search results when the document changes.)
            foreach (var searchResult in searchResults)
            {
                _searchResults.Add(searchResult);
            }

            // Order search results. (The search query determines the search direction.
            // The search results should start at the caret position.)
            if (query.SearchBackwards)
            {
                int numberOfSearchResults = searchResults.Count;
                int movedSearchResults    = 0;
                for (int i = 0; i < numberOfSearchResults; i++)
                {
                    var searchResult = searchResults[i];
                    if (searchResult.EndOffset < caretOffset)
                    {
                        searchResults.Add(searchResult);
                        movedSearchResults++;
                    }
                    else
                    {
                        break;
                    }
                }

                searchResults.RemoveRange(0, movedSearchResults);
                searchResults.Reverse();
            }
            else
            {
                int numberOfSearchResults = searchResults.Count;
                int movedSearchResults    = 0;
                for (int i = 0; i < numberOfSearchResults; i++)
                {
                    var searchResult = searchResults[i];
                    if (searchResult.StartOffset < caretOffset)
                    {
                        searchResults.Add(searchResult);
                        movedSearchResults++;
                    }
                    else
                    {
                        break;
                    }
                }

                searchResults.RemoveRange(0, movedSearchResults);
            }

            return(searchResults);
        }