public async Task <bool> PerformIncludeWhatYouUse(EnvDTE.Document document) { if (document == null) { return(false); } await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); var settingsIwyu = (IncludeWhatYouUseOptionsPage)Package.GetDialogPage(typeof(IncludeWhatYouUseOptionsPage)); var canCompile = await VSUtils.VCUtils.IsCompilableFile(document); if (canCompile.Result == false) { Output.Instance.WriteLine($"Can't compile file '{canCompile.Reason}': {document.Name}"); return(false); } if (WorkInProgress) { _ = Output.Instance.ErrorMsg("Include What You Use already in progress!"); return(false); } WorkInProgress = true; // Save all documents. try { document.DTE.Documents.SaveAll(); } catch (Exception saveException) { Output.Instance.WriteLine("Failed to get save all documents: {0}", saveException); } var project = document.ProjectItem?.ContainingProject; if (project == null) { Output.Instance.WriteLine("The document {0} is not part of a project.", document.Name); return(false); } var dialogFactory = ServiceProvider.GetService(typeof(SVsThreadedWaitDialogFactory)) as IVsThreadedWaitDialogFactory; if (dialogFactory == null) { Output.Instance.WriteLine("Failed to get IVsThreadedWaitDialogFactory service."); return(false); } await OptionalDownloadOrUpdate(settingsIwyu, dialogFactory); // Start wait dialog. { IVsThreadedWaitDialog2 dialog = null; dialogFactory.CreateInstance(out dialog); dialog?.StartWaitDialog("Include Toolbox", "Running include-what-you-use", null, null, "Running include-what-you-use", 0, false, true); string output = await IWYU.RunIncludeWhatYouUse(document.FullName, project, settingsIwyu); if (settingsIwyu.ApplyProposal && output != null) { var settingsFormatting = (FormatterOptionsPage)Package.GetDialogPage(typeof(FormatterOptionsPage)); await IWYU.Apply(output, settingsIwyu.RunIncludeFormatter, settingsFormatting); } dialog?.EndWaitDialog(); } return(true); }
/// <summary> /// This function is the callback used to execute the command when the menu item is clicked. /// See the constructor to see how the menu item is associated with this function using /// OleMenuCommandService service and MenuCommand class. /// </summary> /// <param name="sender">Event sender.</param> /// <param name="e">Event args.</param> protected override async Task MenuItemCallback(object sender, EventArgs e) { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); var settingsIwyu = (IncludeWhatYouUseOptionsPage)Package.GetDialogPage(typeof(IncludeWhatYouUseOptionsPage)); Output.Instance.Clear(); var document = VSUtils.GetDTE().ActiveDocument; if (document == null) { Output.Instance.WriteLine("No active document!"); return; } var project = document.ProjectItem?.ContainingProject; if (project == null) { Output.Instance.WriteLine("The document {0} is not part of a project.", document.Name); return; } var dialogFactory = ServiceProvider.GetService(typeof(SVsThreadedWaitDialogFactory)) as IVsThreadedWaitDialogFactory; if (dialogFactory == null) { Output.Instance.WriteLine("Failed to get IVsThreadedWaitDialogFactory service."); return; } await OptionalDownloadOrUpdate(settingsIwyu, dialogFactory); // We should really have it now, but just in case our update or download method screwed up. if (!File.Exists(settingsIwyu.ExecutablePath)) { await Output.Instance.ErrorMsg("Unexpected error: Can't find include-what-you-use.exe after download/update."); return; } checkedForUpdatesThisSession = true; // Save all documents. try { document.DTE.Documents.SaveAll(); } catch (Exception saveException) { Output.Instance.WriteLine("Failed to get save all documents: {0}", saveException); } // Start wait dialog. { IVsThreadedWaitDialog2 dialog = null; dialogFactory.CreateInstance(out dialog); dialog?.StartWaitDialog("Include Toolbox", "Running include-what-you-use", null, null, "Running include-what-you-use", 0, false, true); string output = await IWYU.RunIncludeWhatYouUse(document.FullName, project, settingsIwyu); if (settingsIwyu.ApplyProposal && output != null) { var settingsFormatting = (FormatterOptionsPage)Package.GetDialogPage(typeof(FormatterOptionsPage)); await IWYU.Apply(output, settingsIwyu.RunIncludeFormatter, settingsFormatting); } dialog?.EndWaitDialog(); } }