Exemple #1
0
        /// <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);
        }
Exemple #2
0
        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;
        }
Exemple #3
0
        /// <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));
        }
Exemple #4
0
        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;
        }