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); } } } }); }
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); } } }