private static FixAllSuggestedAction GetFixAllSuggestedAction(IEnumerable <SuggestedActionSet> actionSets, FixAllScope fixAllScope) { foreach (var actionSet in actionSets) { foreach (var action in actionSet.Actions) { if (action is FixAllSuggestedAction fixAllSuggestedAction) { var fixAllCodeAction = fixAllSuggestedAction.CodeAction as FixSomeCodeAction; if (fixAllCodeAction?.FixAllState?.Scope == fixAllScope) { return(fixAllSuggestedAction); } } if (action.HasActionSets) { var nestedActionSets = HostWaitHelper.PumpingWaitResult(action.GetActionSetsAsync(CancellationToken.None)); fixAllSuggestedAction = GetFixAllSuggestedAction(nestedActionSets, fixAllScope); if (fixAllSuggestedAction != null) { return(fixAllSuggestedAction); } } } } return(null); }
private Action <IWpfTextView> GetLightBulbApplicationAction(string actionName, FixAllScope?fixAllScope) { return(view => { var broker = GetComponentModel().GetService <ILightBulbBroker>(); var actions = GetLightBulbActions(broker, view).ToArray(); var action = actions.FirstOrDefault(a => a.DisplayText == actionName); if (action == null) { var sb = new StringBuilder(); foreach (var item in actions) { sb.AppendLine("Actual ISuggestedAction: " + item.DisplayText); } var bufferType = view.TextBuffer.ContentType.DisplayName; throw new InvalidOperationException( string.Format("ISuggestedAction {0} not found. Buffer content type={1}\r\nActions: {2}", actionName, bufferType, sb.ToString())); } if (fixAllScope != null) { if (!action.HasActionSets) { throw new InvalidOperationException($"Suggested action '{action.DisplayText}' does not support FixAllOccurrences."); } var actionSetsForAction = HostWaitHelper.PumpingWaitResult(action.GetActionSetsAsync(CancellationToken.None)); action = GetFixAllSuggestedAction(actionSetsForAction, fixAllScope.Value); if (action == null) { throw new InvalidOperationException($"Unable to find FixAll in {fixAllScope.ToString()} code fix for suggested action '{action.DisplayText}'."); } if (string.IsNullOrEmpty(actionName)) { return; } // Dismiss the lightbulb session as we not invoking the original code fix. broker.DismissSession(view); } action.Invoke(CancellationToken.None); }); }
private IEnumerable <ISuggestedAction> SelectActions(IEnumerable <SuggestedActionSet> actionSets) { var actions = new List <ISuggestedAction>(); if (actionSets != null) { foreach (var actionSet in actionSets) { if (actionSet.Actions != null) { foreach (var action in actionSet.Actions) { actions.Add(action); actions.AddRange(SelectActions(HostWaitHelper.PumpingWaitResult(action.GetActionSetsAsync(CancellationToken.None)))); } } } } return(actions); }
private ClassifiedToken[] GetLightbulbPreviewClassifications( string menuText, ILightBulbBroker broker, IWpfTextView view, IViewClassifierAggregatorService viewClassifierAggregator, IEditorPrimitivesFactoryService editorPrimitives) { LightBulbHelper.WaitForLightBulbSession(broker, view); var bufferType = view.TextBuffer.ContentType.DisplayName; if (!broker.IsLightBulbSessionActive(view)) { throw new Exception(string.Format("No Active Smart Tags in View! Buffer content type={0}", bufferType)); } var activeSession = broker.GetSession(view); if (activeSession == null || !activeSession.IsExpanded) { throw new InvalidOperationException(string.Format("No expanded light bulb session found after View.ShowSmartTag. Buffer content type={0}", bufferType)); } if (!string.IsNullOrEmpty(menuText)) { IEnumerable <SuggestedActionSet> actionSets; if (activeSession.TryGetSuggestedActionSets(out actionSets) != QuerySuggestedActionCompletionStatus.Completed) { actionSets = Array.Empty <SuggestedActionSet>(); } var set = actionSets.SelectMany(s => s.Actions).FirstOrDefault(a => a.DisplayText == menuText); if (set == null) { throw new InvalidOperationException( string.Format("ISuggestionAction {0} not found. Buffer content type={1}", menuText, bufferType)); } IWpfTextView preview = null; object pane = HostWaitHelper.PumpingWaitResult(set.GetPreviewAsync(CancellationToken.None)); if (pane is System.Windows.Controls.UserControl) { var container = ((System.Windows.Controls.UserControl)pane).FindName("PreviewDockPanel") as DockPanel; var host = FindDescendants <UIElement>(container).OfType <IWpfTextViewHost>().LastOrDefault(); preview = (host == null) ? null : host.TextView; } if (preview == null) { throw new InvalidOperationException(string.Format("Could not find light bulb preview. Buffer content type={0}", bufferType)); } activeSession.Collapse(); var classifier = viewClassifierAggregator.GetClassifier(preview); var classifiedSpans = classifier.GetClassificationSpans(new SnapshotSpan(preview.TextBuffer.CurrentSnapshot, 0, preview.TextBuffer.CurrentSnapshot.Length)); return(classifiedSpans.Select(x => new ClassifiedToken(x.Span.GetText().ToString(), x.ClassificationType.Classification)).ToArray()); } activeSession.Collapse(); return(Array.Empty <ClassifiedToken>()); }