QuickInfoSourceProvider.QuickInfoSource.cs 3.0 KB
Newer Older
1 2
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information.

J
JieCarolHu 已提交
3
using System;
J
part #2  
JieCarolHu 已提交
4 5
using System.Threading;
using System.Threading.Tasks;
J
JieCarolHu 已提交
6 7 8 9
using Microsoft.CodeAnalysis.ErrorReporting;
using Microsoft.CodeAnalysis.Internal.Log;
using Microsoft.CodeAnalysis.QuickInfo;
using Microsoft.CodeAnalysis.Text;
10
using Microsoft.CodeAnalysis.Text.Shared.Extensions;
11 12
using Microsoft.VisualStudio.Language.Intellisense;
using Microsoft.VisualStudio.Text;
J
JieCarolHu 已提交
13 14 15
using Roslyn.Utilities;

using IntellisenseQuickInfoItem = Microsoft.VisualStudio.Language.Intellisense.QuickInfoItem;
16

17
namespace Microsoft.CodeAnalysis.Editor.Implementation.IntelliSense.QuickInfo
18
{
19
    internal partial class QuickInfoSourceProvider
20
    {
J
part #2  
JieCarolHu 已提交
21
        private class QuickInfoSource : IAsyncQuickInfoSource
J
JieCarolHu 已提交
22
        {
J
JieCarolHu 已提交
23
            private readonly ITextBuffer _subjectBuffer;
24

J
JieCarolHu 已提交
25
            public QuickInfoSource(ITextBuffer subjectBuffer)
J
JieCarolHu 已提交
26
            {
27 28 29
                _subjectBuffer = subjectBuffer;
            }

J
JieCarolHu 已提交
30
            public async Task<IntellisenseQuickInfoItem> GetQuickInfoItemAsync(IAsyncQuickInfoSession session, CancellationToken cancellationToken)
J
part #2  
JieCarolHu 已提交
31
            {
J
JieCarolHu 已提交
32
                var triggerPoint = session.GetTriggerPoint(_subjectBuffer.CurrentSnapshot);
J
JieCarolHu 已提交
33
                if (!triggerPoint.HasValue)
J
part #2  
JieCarolHu 已提交
34
                {
J
JieCarolHu 已提交
35 36
                    return null;
                }
J
JieCarolHu 已提交
37

J
JieCarolHu 已提交
38 39 40 41 42 43 44 45 46 47 48 49
                var snapshot = triggerPoint.Value.Snapshot;
                var document = snapshot.GetOpenDocumentInCurrentContextWithChanges();
                if (document == null)
                {
                    return null;
                }

                var service = QuickInfoService.GetService(document);
                if (service == null)
                {
                    return null;
                }
J
JieCarolHu 已提交
50

J
JieCarolHu 已提交
51 52
                try
                {
J
JieCarolHu 已提交
53
                    using (Internal.Log.Logger.LogBlock(FunctionId.Get_QuickInfo_Async, cancellationToken))
J
JieCarolHu 已提交
54
                    {
J
JieCarolHu 已提交
55
                        cancellationToken.ThrowIfCancellationRequested();
J
JieCarolHu 已提交
56

J
JieCarolHu 已提交
57 58 59 60 61
                        var item = await service.GetQuickInfoAsync(document, triggerPoint.Value, cancellationToken).ConfigureAwait(false);
                        if (item != null)
                        {
                            var textVersion = snapshot.Version;
                            var trackingSpan = textVersion.CreateTrackingSpan(item.Span.ToSpan(), SpanTrackingMode.EdgeInclusive);
C
Carol Hu 已提交
62
                            return await IntellisenseQuickInfoBuilder.BuildItemAsync(trackingSpan, item, snapshot, document, cancellationToken).ConfigureAwait(false);
J
JieCarolHu 已提交
63
                        }
J
JieCarolHu 已提交
64 65

                        return null;
J
part #2  
JieCarolHu 已提交
66 67
                    }
                }
J
JieCarolHu 已提交
68 69 70 71
                catch (Exception e) when (FatalError.ReportUnlessCanceled(e))
                {
                    throw ExceptionUtilities.Unreachable;
                }
J
JieCarolHu 已提交
72 73
            }

74 75 76 77 78 79
            public void Dispose()
            {
            }
        }
    }
}