Ejemplo n.º 1
0
        private void AddRootNode(ViewCallHierarchyCommandArgs args)
        {
            _waitIndicator.Wait(EditorFeaturesResources.CallHierarchy, EditorFeaturesResources.ComputingCallHierarchyInformation, allowCancel: true, action: waitcontext =>
            {
                var cancellationToken = waitcontext.CancellationToken;
                var document          = args.SubjectBuffer.CurrentSnapshot.GetOpenDocumentInCurrentContextWithChanges();
                if (document == null)
                {
                    return;
                }

                var workspace     = document.Project.Solution.Workspace;
                var semanticModel = document.GetSemanticModelAsync(waitcontext.CancellationToken).WaitAndGetResult(cancellationToken);

                var caretPosition    = args.TextView.Caret.Position.BufferPosition.Position;
                var symbolUnderCaret = SymbolFinder.FindSymbolAtPosition(semanticModel, caretPosition, workspace, cancellationToken);

                if (symbolUnderCaret != null)
                {
                    // Map symbols so that Call Hierachy works from metadata-as-source
                    var mappingService = document.Project.Solution.Workspace.Services.GetService <ISymbolMappingService>();
                    var mapping        = mappingService.MapSymbolAsync(document, symbolUnderCaret, waitcontext.CancellationToken).WaitAndGetResult(cancellationToken);

                    if (mapping.Symbol != null)
                    {
                        var node = _provider.CreateItem(mapping.Symbol, mapping.Project, SpecializedCollections.EmptyEnumerable <Location>(), cancellationToken).WaitAndGetResult(cancellationToken);
                        if (node != null)
                        {
                            _presenter.PresentRoot((CallHierarchyItem)node);
                        }
                    }
                }
            });
        }
Ejemplo n.º 2
0
        private void AddRootNode(ViewCallHierarchyCommandArgs args, CommandExecutionContext context)
        {
            using (var waitScope = context.WaitContext.AddScope(allowCancellation: true, EditorFeaturesResources.Computing_Call_Hierarchy_Information))
            {
                var cancellationToken = context.WaitContext.UserCancellationToken;
                var document          = args.SubjectBuffer.CurrentSnapshot.GetOpenDocumentInCurrentContextWithChanges();
                if (document == null)
                {
                    return;
                }

                var workspace     = document.Project.Solution.Workspace;
                var semanticModel = document.GetSemanticModelAsync(cancellationToken).WaitAndGetResult(cancellationToken);

                var caretPosition    = args.TextView.Caret.Position.BufferPosition.Position;
                var symbolUnderCaret = SymbolFinder.FindSymbolAtPositionAsync(semanticModel, caretPosition, workspace, cancellationToken)
                                       .WaitAndGetResult(cancellationToken);

                if (symbolUnderCaret != null)
                {
                    // Map symbols so that Call Hierarchy works from metadata-as-source
                    var mappingService = document.Project.Solution.Workspace.Services.GetService <ISymbolMappingService>();
                    var mapping        = mappingService.MapSymbolAsync(document, symbolUnderCaret, cancellationToken).WaitAndGetResult(cancellationToken);

                    if (mapping.Symbol != null)
                    {
                        var node = _provider.CreateItem(mapping.Symbol, mapping.Project, SpecializedCollections.EmptyEnumerable <Location>(), cancellationToken).WaitAndGetResult(cancellationToken);
                        if (node != null)
                        {
                            _presenter.PresentRoot((CallHierarchyItem)node);
                        }
                    }
                }
                else
                {
                    // We are about to show a modal UI dialog so we should take over the command execution
                    // wait context. That means the command system won't attempt to show its own wait dialog
                    // and also will take it into consideration when measuring command handling duration.
                    waitScope.Context.TakeOwnership();
                    var notificationService = document.Project.Solution.Workspace.Services.GetService <INotificationService>();
                    notificationService.SendNotification(EditorFeaturesResources.Cursor_must_be_on_a_member_name, severity: NotificationSeverity.Information);
                }
            }
        }