QuickInfoSourceProvider.QuickInfoSource.cs 3.4 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
22
        {
23
            private readonly QuickInfoSourceProvider _quickInfoSourceProvider;
J
JieCarolHu 已提交
24 25
            private readonly ITextBuffer _subjectBuffer;            
            private IDocumentProvider _documentProvider = new DocumentProvider();
26

27
            public QuickInfoSource(QuickInfoSourceProvider quickInfoSourceProvider, ITextBuffer subjectBuffer)
28
            {
29
                _quickInfoSourceProvider = quickInfoSourceProvider;
30 31 32
                _subjectBuffer = subjectBuffer;
            }

J
JieCarolHu 已提交
33
            public async Task<IntellisenseQuickInfoItem> GetQuickInfoItemAsync(IAsyncQuickInfoSession session, CancellationToken cancellationToken)
J
part #2  
JieCarolHu 已提交
34
            {
J
JieCarolHu 已提交
35
                var triggerPoint = session.GetTriggerPoint(_subjectBuffer.CurrentSnapshot);
36
                if (triggerPoint.HasValue)
J
part #2  
JieCarolHu 已提交
37
                {
J
JieCarolHu 已提交
38 39 40 41 42 43 44 45 46 47 48
                    var snapshot = _subjectBuffer.CurrentSnapshot;
                    var document = snapshot.GetOpenDocumentInCurrentContextWithChanges();
                    if (document == null)
                    {
                        return null;
                    }

                    var service = QuickInfoService.GetService(document);
                    if (service == null)
                    {
                        return null;
49 50
                    }
                    
J
JieCarolHu 已提交
51 52 53 54 55 56 57 58 59
                    try
                    {
                        using (Internal.Log.Logger.LogBlock(FunctionId.QuickInfo_ModelComputation_ComputeModelInBackground, cancellationToken))
                        {
                            cancellationToken.ThrowIfCancellationRequested();                            

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

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

J
JieCarolHu 已提交
74
                return null;
J
part #2  
JieCarolHu 已提交
75
            }
J
JieCarolHu 已提交
76
           
77 78 79 80 81 82
            public void Dispose()
            {
            }
        }
    }
}