/// <summary> /// Asynchronously constructs a line map from a <paramref name="snapshot"/> and <paramref name="code"/>. /// </summary> /// <param name="snapshot">The current text snapshot.</param> /// <param name="code">The code to derive a line map from.</param> /// <param name="cancelToken">Cancellation token.</param> /// <returns> /// A <see cref="LineMap"/> if <paramref name="code"/> was parsed correctly, /// <c>null</c> if there was invalid code or it was canceled. /// </returns> internal static Task<LineMap> ConstructAsync(ITextSnapshot snapshot, string code, CancellationToken cancelToken) { if (snapshot == null) throw new ArgumentNullException ("snapshot"); if (code == null) throw new ArgumentNullException ("code"); return Task<LineMap>.Factory.StartNew (() => { try { var tree = SyntaxTree.Parse (code, cancellationToken: cancelToken); if (tree.Errors.Any (p => p.ErrorType == ErrorType.Error)) return null; var identifier = new IdentifyingVisitor(); tree.AcceptVisitor (identifier); var spans = new Dictionary<int, ITrackingSpan> (identifier.LineMap.Count); foreach (var kvp in identifier.LineMap) { ITextSnapshotLine line = snapshot.GetLineFromLineNumber (kvp.Value - 1); ITrackingSpan span = snapshot.CreateTrackingSpan (line.Extent, SpanTrackingMode.EdgeExclusive); spans.Add (kvp.Key, span); } return (cancelToken.IsCancellationRequested) ? null : new LineMap (spans); } catch (OperationCanceledException) { return null; } }, cancelToken); }
private void Update() { if (this.updating || this.MethodCall == null) { return; } this.updating = true; var identifier = new IdentifyingVisitor(); SyntaxTree tree = SyntaxTree.Parse(Text); tree.AcceptVisitor(identifier); IdCode = tree.GetText(); var layer = AdornerLayer.GetAdornerLayer(this); foreach (Adorner adorner in this.adorners.Values) { layer.Remove(adorner); } this.adorners.Clear(); if (identifier.LineMap.Count > 0) { AdornOperationContainer(this.MethodCall, identifier.LineMap, layer); } this.updating = false; }
/// <summary> /// Asynchronously constructs a line map from a <paramref name="snapshot"/> and <paramref name="code"/>. /// </summary> /// <param name="snapshot">The current text snapshot.</param> /// <param name="code">The code to derive a line map from.</param> /// <param name="cancelToken">Cancellation token.</param> /// <returns> /// A <see cref="LineMap"/> if <paramref name="code"/> was parsed correctly, /// <c>null</c> if there was invalid code or it was canceled. /// </returns> internal static Task <LineMap> ConstructAsync(ITextSnapshot snapshot, string code, CancellationToken cancelToken) { if (snapshot == null) { throw new ArgumentNullException("snapshot"); } if (code == null) { throw new ArgumentNullException("code"); } return(Task <LineMap> .Factory.StartNew(() => { try { var tree = SyntaxTree.Parse(code, cancellationToken: cancelToken); if (tree.Errors.Any(p => p.ErrorType == ErrorType.Error)) { return null; } var identifier = new IdentifyingVisitor(); tree.AcceptVisitor(identifier); var spans = new Dictionary <int, ITrackingSpan> (identifier.LineMap.Count); foreach (var kvp in identifier.LineMap) { ITextSnapshotLine line = snapshot.GetLineFromLineNumber(kvp.Value - 1); ITrackingSpan span = snapshot.CreateTrackingSpan(line.Extent, SpanTrackingMode.EdgeExclusive); spans.Add(kvp.Key, span); } return (cancelToken.IsCancellationRequested) ? null : new LineMap(spans); } catch (OperationCanceledException) { return null; } }, cancelToken)); }
private void Update() { if (this.updating || this.MethodCall == null) return; this.updating = true; var identifier = new IdentifyingVisitor(); SyntaxTree tree = SyntaxTree.Parse (Text); tree.AcceptVisitor (identifier); IdCode = tree.GetText(); var layer = AdornerLayer.GetAdornerLayer (this); foreach (Adorner adorner in this.adorners.Values) layer.Remove (adorner); this.adorners.Clear(); if (identifier.LineMap.Count > 0) AdornOperationContainer (this.MethodCall, identifier.LineMap, layer); this.updating = false; }