Esempio n. 1
0
        public async Task <DataTipInfo> GetDebugInfoAsync(SnapshotPoint snapshotPoint, CancellationToken cancellationToken)
        {
            var analysisDocument = snapshotPoint.Snapshot.AsText().GetOpenDocumentInCurrentContextWithChanges();

            IProjectionSnapshot projectionSnapshot = null;

            if (analysisDocument == null)
            {
                projectionSnapshot = snapshotPoint.Snapshot as IProjectionSnapshot;
                if (projectionSnapshot != null)
                {
                    snapshotPoint    = projectionSnapshot.MapToSourceSnapshot(snapshotPoint.Position);
                    analysisDocument = snapshotPoint.Snapshot.AsText().GetOpenDocumentInCurrentContextWithChanges();
                }
            }

            if (analysisDocument == null)
            {
                return(default(DataTipInfo));
            }
            var debugInfoService = analysisDocument.GetLanguageService <Microsoft.CodeAnalysis.Editor.Implementation.Debugging.ILanguageDebugInfoService> ();

            if (debugInfoService == null)
            {
                return(default(DataTipInfo));
            }

            var tipInfo = await debugInfoService.GetDataTipInfoAsync(analysisDocument, snapshotPoint.Position, cancellationToken).ConfigureAwait(false);

            var text = tipInfo.Text;

            if (text == null && !tipInfo.IsDefault)
            {
                text = snapshotPoint.Snapshot.GetText(tipInfo.Span.Start, tipInfo.Span.Length);
            }

            var semanticModel = await analysisDocument.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);

            var root = await semanticModel.SyntaxTree.GetRootAsync(cancellationToken).ConfigureAwait(false);

            var syntaxNode = root.FindNode(tipInfo.Span);
            DebugDataTipInfo debugDataTipInfo;

            if (syntaxNode == null)
            {
                debugDataTipInfo = new DebugDataTipInfo(tipInfo.Span, text);
            }
            else
            {
                debugDataTipInfo = GetInfo(root, semanticModel, syntaxNode, text, cancellationToken);
            }

            if (projectionSnapshot != null)
            {
                var originalSpan = projectionSnapshot.MapFromSourceSnapshot(new SnapshotSpan(snapshotPoint.Snapshot, debugDataTipInfo.Span.Start, debugDataTipInfo.Span.Length)).FirstOrDefault();
                if (originalSpan == default)
                {
                    return(default);
Esempio n. 2
0
        internal static SnapshotPoint?MapDownToFirstMatchNoTrack(SnapshotPoint position, Predicate <ITextBuffer> match)
        {
            while (!match(position.Snapshot.TextBuffer))
            {
                IProjectionSnapshot projSnap = position.Snapshot as IProjectionSnapshot;
                if ((projSnap == null) || (projSnap.SourceSnapshots.Count == 0))
                {
                    return(null);
                }

                position = projSnap.MapToSourceSnapshot(position);
            }
            return(position);
        }
Esempio n. 3
0
        internal static SnapshotPoint?MapDownToBufferNoTrack(SnapshotPoint position, ITextBuffer targetBuffer, PositionAffinity affinity)
        {
            while (position.Snapshot.TextBuffer != targetBuffer)
            {
                IProjectionSnapshot projSnap = position.Snapshot as IProjectionSnapshot;
                if ((projSnap == null) || (projSnap.SourceSnapshots.Count == 0))
                {
                    return(null);
                }

                position = projSnap.MapToSourceSnapshot(position, affinity);
            }
            return(position);
        }
Esempio n. 4
0
        public SnapshotPoint?MapDownToFirstMatch(SnapshotPoint position, PointTrackingMode trackingMode, Predicate <ITextSnapshot> match, PositionAffinity affinity)
        {
            if (position.Snapshot == null)
            {
                throw new ArgumentNullException("position");
            }
            if (trackingMode < PointTrackingMode.Positive || trackingMode > PointTrackingMode.Negative)
            {
                throw new ArgumentOutOfRangeException("trackingMode");
            }
            if (match == null)
            {
                throw new ArgumentNullException("match");
            }
            if (affinity < PositionAffinity.Predecessor || affinity > PositionAffinity.Successor)
            {
                throw new ArgumentOutOfRangeException("affinity");
            }
            if (!this.importingProjectionBufferMap.ContainsKey(position.Snapshot.TextBuffer))
            {
                return(null);
            }

            ITextBuffer   currentBuffer   = position.Snapshot.TextBuffer;
            ITextSnapshot currentSnapshot = currentBuffer.CurrentSnapshot;
            int           currentPosition = position.TranslateTo(currentSnapshot, trackingMode).Position;

            while (!match(currentSnapshot))
            {
                IProjectionBufferBase projBuffer = currentBuffer as IProjectionBufferBase;
                if (projBuffer == null)
                {
                    return(null);
                }
                IProjectionSnapshot projSnap = projBuffer.CurrentSnapshot;
                if (projSnap.SourceSnapshots.Count == 0)
                {
                    return(null);
                }
                SnapshotPoint currentPoint = projSnap.MapToSourceSnapshot(currentPosition, affinity);
                currentPosition = currentPoint.Position;
                currentSnapshot = currentPoint.Snapshot;
                currentBuffer   = currentSnapshot.TextBuffer;
            }
            return(new SnapshotPoint(currentSnapshot, currentPosition));
        }
Esempio n. 5
0
        public SnapshotPoint?MapDownToBuffer(SnapshotPoint position, PointTrackingMode trackingMode, ITextBuffer targetBuffer, PositionAffinity affinity)
        {
            if (position.Snapshot == null)
            {
                throw new ArgumentNullException("position");
            }
            if (trackingMode < PointTrackingMode.Positive || trackingMode > PointTrackingMode.Negative)
            {
                throw new ArgumentOutOfRangeException("trackingMode");
            }
            if (targetBuffer == null)
            {
                throw new ArgumentNullException("targetBuffer");
            }
            if (affinity < PositionAffinity.Predecessor || affinity > PositionAffinity.Successor)
            {
                throw new ArgumentOutOfRangeException("affinity");
            }

            ITextBuffer   currentBuffer   = position.Snapshot.TextBuffer;
            ITextSnapshot currentSnapshot = currentBuffer.CurrentSnapshot;
            int           currentPosition = position.TranslateTo(currentSnapshot, trackingMode).Position;

            while (currentBuffer != targetBuffer)
            {
                IProjectionBufferBase projBuffer = currentBuffer as IProjectionBufferBase;
                if (projBuffer == null)
                {
                    return(null);
                }
                IProjectionSnapshot projSnap = projBuffer.CurrentSnapshot;
                if (projSnap.SourceSnapshots.Count == 0)
                {
                    return(null);
                }
                SnapshotPoint currentPoint = projSnap.MapToSourceSnapshot(currentPosition, affinity);
                currentPosition = currentPoint.Position;
                currentSnapshot = currentPoint.Snapshot;
                currentBuffer   = currentSnapshot.TextBuffer;
            }

            return(new SnapshotPoint(currentSnapshot, currentPosition));
        }
Esempio n. 6
0
        /// <summary>
        /// Activates a text view for a text buffer, and sets the cursor to a specific location
        /// </summary>
        public static bool NavigateToTextBuffer(ITextBuffer textBuffer, int start, int length)
        {
            IProjectionSnapshot projectionSnapshot = textBuffer.CurrentSnapshot as IProjectionSnapshot;

            if (projectionSnapshot != null)
            {
                // Find the main buffer for the view

                SnapshotPoint sourcePoint = new SnapshotPoint();
                bool          success     = true;

                try {
                    sourcePoint = projectionSnapshot.MapToSourceSnapshot(start, PositionAffinity.Successor);
                } catch (ArgumentOutOfRangeException) {
                    success = false;
                } catch (InvalidOperationException) {
                    success = false;
                }

                if (success)
                {
                    return(NavigateToTextBuffer(sourcePoint.Snapshot.TextBuffer, sourcePoint.Position, length));
                }
            }
            else
            {
                // This is the main buffer for the view

                IVsTextManager textManager  = VsAppShell.Current.GetGlobalService <IVsTextManager>(typeof(SVsTextManager));
                IVsTextBuffer  vsTextBuffer = textBuffer.GetBufferAdapter <IVsTextBuffer>();
                Guid           viewType     = VSConstants.LOGVIEWID_TextView;

                if (vsTextBuffer != null &&
                    ErrorHandler.Succeeded(textManager.NavigateToPosition(vsTextBuffer, ref viewType, start, length)))
                {
                    return(true);
                }
            }

            return(false);
        }
Esempio n. 7
0
        public SnapshotPoint?MapDownToInsertionPoint(SnapshotPoint position, PointTrackingMode trackingMode, Predicate <ITextSnapshot> match)
        {
            if (position.Snapshot == null)
            {
                throw new ArgumentNullException("position");
            }
            if (trackingMode < PointTrackingMode.Positive || trackingMode > PointTrackingMode.Negative)
            {
                throw new ArgumentOutOfRangeException("trackingMode");
            }
            if (match == null)
            {
                throw new ArgumentNullException("match");
            }

            ITextBuffer   currentBuffer   = position.Snapshot.TextBuffer;
            int           currentPosition = position.TranslateTo(currentBuffer.CurrentSnapshot, trackingMode);
            ITextSnapshot currentSnapshot = currentBuffer.CurrentSnapshot;

            while (!match(currentSnapshot))
            {
                IProjectionBufferBase projBuffer = currentBuffer as IProjectionBufferBase;
                if (projBuffer == null)
                {
                    return(null);
                }
                IProjectionSnapshot projSnap = projBuffer.CurrentSnapshot;
                if (projSnap.SourceSnapshots.Count == 0)
                {
                    return(null);
                }
                SnapshotPoint currentPoint = projSnap.MapToSourceSnapshot(currentPosition);
                currentPosition = currentPoint.Position;
                currentSnapshot = currentPoint.Snapshot;
                currentBuffer   = currentSnapshot.TextBuffer;
            }
            return(new SnapshotPoint(currentSnapshot, currentPosition));
        }