void GetAllProviderStates() { var language = CodeRefactoringService.MimeTypeToLanguage(mimeType); foreach (var node in BuiltInCodeDiagnosticProvider.GetBuiltInCodeRefactoringDescriptorsAsync(CodeRefactoringService.MimeTypeToLanguage(language), true).Result) { providerStates [node] = node.IsEnabled; } }
public static async Task <CodeFixMenu> CreateFixMenu(TextEditor editor, CodeActionContainer fixes, CancellationToken cancellationToken = default(CancellationToken)) { var menu = new CodeFixMenu(); if (editor.DocumentContext.AnalysisDocument == null) { return(menu); } int mnemonic = 1; foreach (var fix in fixes.CodeFixActions.OrderByDescending(i => GetUsage(i.CodeAction.EquivalenceKey))) { AddFixMenuItem(editor, menu, ref mnemonic, fix.CodeAction); } bool first = true; foreach (var fix in fixes.CodeRefactoringActions) { if (first) { if (menu.Items.Count > 0) { menu.Add(CodeFixMenuEntry.Separator); } first = false; } AddFixMenuItem(editor, menu, ref mnemonic, fix.CodeAction); } var warningsAtCaret = (await editor.DocumentContext.AnalysisDocument.GetSemanticModelAsync(cancellationToken)) .GetDiagnostics(new TextSpan(editor.CaretOffset, 0)) .Where(diag => diag.Severity == DiagnosticSeverity.Warning).ToList(); var caretSpan = new TextSpan(editor.CaretOffset, 0); first = true; foreach (var warning in warningsAtCaret) { if (string.IsNullOrWhiteSpace(warning.Descriptor.Title.ToString())) { continue; } var label = GettextCatalog.GetString("_Options for \u2018{0}\u2019", warning.Descriptor.Title); var subMenu = new CodeFixMenu(label); await AddSuppressionMenuItems(subMenu, editor, warning, caretSpan); if (subMenu.Items.Count > 0) { if (first) { menu.Add(CodeFixMenuEntry.Separator); first = false; } menu.Add(subMenu); } } first = true; foreach (var diag in fixes.DiagnosticsAtCaret) { if (string.IsNullOrWhiteSpace(diag.Descriptor.Title.ToString())) { continue; } var notConfigurable = DescriptorHasTag(diag.Descriptor, WellKnownDiagnosticTags.NotConfigurable); var label = GettextCatalog.GetString("_Options for \u2018{0}\u2019", diag.Descriptor.Title); var subMenu = new CodeFixMenu(label); if (first) { menu.Add(CodeFixMenuEntry.Separator); first = false; } await AddSuppressionMenuItems(subMenu, editor, diag, caretSpan); var descriptor = BuiltInCodeDiagnosticProvider.GetCodeDiagnosticDescriptor(diag.Id); if (descriptor != null && IsConfigurable(diag.Descriptor)) { var optionsMenuItem = new CodeFixMenuEntry(GettextCatalog.GetString("_Configure Rule"), delegate { IdeApp.Workbench.ShowGlobalPreferencesDialog(null, "C#", dialog => { var panel = dialog.GetPanel <CodeIssuePanel> ("C#"); if (panel == null) { return; } panel.Widget.SelectCodeIssue(diag.Descriptor.Id); }); }); subMenu.Add(optionsMenuItem); } foreach (var fix in fixes.CodeFixActions.OrderByDescending(i => GetUsage(i.CodeAction.EquivalenceKey))) { if (cancellationToken.IsCancellationRequested) { return(null); } var provider = fix.Diagnostic.GetCodeFixProvider().GetFixAllProvider(); if (provider == null) { continue; } if (!provider.GetSupportedFixAllScopes().Contains(FixAllScope.Document)) { continue; } var language = editor.DocumentContext.AnalysisDocument.Project.Language; var diagnosticdDescriptor = fix.Diagnostic?.GetCodeDiagnosticDescriptor(language); if (diagnosticdDescriptor == null) { continue; } var subMenu2 = new CodeFixMenu(GettextCatalog.GetString("Fix all")); var diagnosticAnalyzer = diagnosticdDescriptor.GetProvider(); if (!diagnosticAnalyzer.SupportedDiagnostics.Contains(diag.Descriptor)) { continue; } var menuItem = new CodeFixMenuEntry( GettextCatalog.GetString("In _Document"), async delegate { await FixAll(editor, fix, provider, diagnosticAnalyzer); } ); subMenu2.Add(menuItem); subMenu.Add(CodeFixMenuEntry.Separator); subMenu.Add(subMenu2); } menu.Add(subMenu); } return(menu); }
static CommandInfoSet CreateFixMenu(TextEditor editor, DocumentContext ctx, SemanticModel semanticModel, CodeActionContainer container) { if (editor == null) { throw new ArgumentNullException(nameof(editor)); } if (ctx == null) { throw new ArgumentNullException(nameof(ctx)); } if (container == null) { throw new ArgumentNullException(nameof(container)); } var result = new CommandInfoSet(); result.Text = GettextCatalog.GetString("Fix"); foreach (var diagnostic in container.CodeFixActions) { var info = new CommandInfo(diagnostic.CodeAction.Title); result.CommandInfos.Add(info, new Action(async() => await new CodeActionEditorExtension.ContextActionRunner(diagnostic.CodeAction, editor, ctx).Run())); } bool firstDiagnosticOption = result.CommandInfos.Count != 0; var warningsAtCaret = semanticModel .GetDiagnostics(new TextSpan(editor.CaretOffset, 0)) .Where(diag => diag.Severity == DiagnosticSeverity.Warning).ToList(); foreach (var warning in warningsAtCaret) { if (firstDiagnosticOption) { result.CommandInfos.AddSeparator(); firstDiagnosticOption = false; } var label = GettextCatalog.GetString("_Options for \"{0}\"", warning.Descriptor.Title); var subMenu = new CommandInfoSet(); subMenu.Text = label; var info = new CommandInfo(GettextCatalog.GetString("_Suppress with #pragma")); subMenu.CommandInfos.Add(info, new Action(async delegate { var fixes = await CSharpSuppressionFixProvider.Instance.GetSuppressionsAsync(ctx.AnalysisDocument, new TextSpan(editor.CaretOffset, 0), new [] { warning }, default(CancellationToken)).ConfigureAwait(false); foreach (var f in fixes) { CodeDiagnosticDescriptor.RunAction(ctx, f.Action, default(CancellationToken)); } })); result.CommandInfos.Add(subMenu); } foreach (var fix in container.DiagnosticsAtCaret) { var inspector = BuiltInCodeDiagnosticProvider.GetCodeDiagnosticDescriptor(fix.Id); if (inspector == null) { continue; } if (firstDiagnosticOption) { result.CommandInfos.AddSeparator(); firstDiagnosticOption = false; } var label = GettextCatalog.GetString("_Options for \"{0}\"", fix.GetMessage()); var subMenu = new CommandInfoSet(); subMenu.Text = label; // if (inspector.CanSuppressWithAttribute) { // var menuItem = new FixMenuEntry (GettextCatalog.GetString ("_Suppress with attribute"), // delegate { // // inspector.SuppressWithAttribute (Editor, DocumentContext, GetTextSpan (fix.Item2)); // }); // subMenu.Add (menuItem); // } if (inspector.CanDisableWithPragma) { var info = new CommandInfo(GettextCatalog.GetString("_Suppress with #pragma")); subMenu.CommandInfos.Add(info, new Action(() => inspector.DisableWithPragma(editor, ctx, fix))); info = new CommandInfo(GettextCatalog.GetString("_Suppress with file")); subMenu.CommandInfos.Add(info, new Action(() => inspector.DisableWithFile(editor, ctx, fix))); } var configInfo = new CommandInfo(GettextCatalog.GetString("_Configure Rule")); subMenu.CommandInfos.Add(configInfo, new Action(() => { IdeApp.Workbench.ShowGlobalPreferencesDialog(null, "C#", dialog => { var panel = dialog.GetPanel <CodeIssuePanel> ("C#"); if (panel == null) { return; } panel.Widget.SelectCodeIssue(inspector.IdString); }); })); foreach (var fix2 in container.CodeFixActions) { var provider = fix2.Diagnostic.GetCodeFixProvider().GetFixAllProvider(); if (provider == null) { continue; } if (!provider.GetSupportedFixAllScopes().Contains(FixAllScope.Document)) { continue; } var subMenu2 = new CommandInfoSet(); subMenu2.Text = GettextCatalog.GetString("Fix all"); var diagnosticAnalyzer = fix2.Diagnostic.GetCodeDiagnosticDescriptor(LanguageNames.CSharp).GetProvider(); if (!diagnosticAnalyzer.SupportedDiagnostics.Contains(fix.Descriptor)) { continue; } var info = new CommandInfo(GettextCatalog.GetString("In _Document")); subMenu2.CommandInfos.Add(info, new Action(async delegate { var fixAllDiagnosticProvider = new CodeActionEditorExtension.FixAllDiagnosticProvider(diagnosticAnalyzer.SupportedDiagnostics.Select(d => d.Id).ToImmutableHashSet(), async(Microsoft.CodeAnalysis.Document doc, ImmutableHashSet <string> diagnostics, CancellationToken token) => { var model = await doc.GetSemanticModelAsync(token); var compilationWithAnalyzer = model.Compilation.WithAnalyzers(new [] { diagnosticAnalyzer }.ToImmutableArray(), null, token); return(await compilationWithAnalyzer.GetAnalyzerSemanticDiagnosticsAsync(model, null, token)); }, (arg1, arg2, arg3, arg4) => { return(Task.FromResult((IEnumerable <Diagnostic>) new Diagnostic [] { })); }); var ctx2 = new FixAllContext( ctx.AnalysisDocument, fix2.Diagnostic.GetCodeFixProvider(), FixAllScope.Document, fix2.CodeAction.EquivalenceKey, diagnosticAnalyzer.SupportedDiagnostics.Select(d => d.Id), fixAllDiagnosticProvider, default(CancellationToken) ); var fixAll = await provider.GetFixAsync(ctx2); using (var undo = editor.OpenUndoGroup()) { CodeDiagnosticDescriptor.RunAction(ctx, fixAll, default(CancellationToken)); } })); subMenu.CommandInfos.Add(subMenu2); } result.CommandInfos.Add(subMenu); } return(result); }
void PopulateFixes(FixMenuDescriptor menu, ref int items) { int mnemonic = 1; bool gotImportantFix = false, addedSeparator = false; foreach (var fix_ in GetCurrentFixes().CodeFixActions.OrderByDescending(i => Tuple.Create(IsAnalysisOrErrorFix(i.CodeAction), (int)0, GetUsage(i.CodeAction.EquivalenceKey)))) { // filter out code actions that are already resolutions of a code issue if (IsAnalysisOrErrorFix(fix_.CodeAction)) { gotImportantFix = true; } if (!addedSeparator && gotImportantFix && !IsAnalysisOrErrorFix(fix_.CodeAction)) { menu.Add(FixMenuEntry.Separator); addedSeparator = true; } var fix = fix_; var label = CreateLabel(fix.CodeAction.Title, ref mnemonic); var thisInstanceMenuItem = new FixMenuEntry(label, async delegate { await new ContextActionRunner(fix.CodeAction, Editor, DocumentContext).Run(); ConfirmUsage(fix.CodeAction.EquivalenceKey); }); menu.Add(thisInstanceMenuItem); items++; } bool first = true; foreach (var fix in GetCurrentFixes().CodeRefactoringActions) { if (first) { if (items > 0) { menu.Add(FixMenuEntry.Separator); } first = false; } var label = CreateLabel(fix.CodeAction.Title, ref mnemonic); var thisInstanceMenuItem = new FixMenuEntry(label, async delegate { await new ContextActionRunner(fix.CodeAction, Editor, DocumentContext).Run(); ConfirmUsage(fix.CodeAction.EquivalenceKey); }); menu.Add(thisInstanceMenuItem); items++; } first = false; var warningsAtCaret = (DocumentContext.AnalysisDocument.GetSemanticModelAsync().Result) .GetDiagnostics(new TextSpan(Editor.CaretOffset, 0)) .Where(diag => diag.Severity == DiagnosticSeverity.Warning).ToList(); foreach (var warning in warningsAtCaret) { var label = GettextCatalog.GetString("_Options for \"{0}\"", warning.Descriptor.Title); var subMenu = new FixMenuDescriptor(label); if (first) { menu.Add(FixMenuEntry.Separator); first = false; } var menuItem = new FixMenuEntry(GettextCatalog.GetString("_Suppress with #pragma"), async delegate { var fixes = await CSharpSuppressionFixProvider.Instance.GetSuppressionsAsync(DocumentContext.AnalysisDocument, new TextSpan(Editor.CaretOffset, 0), new [] { warning }, default(CancellationToken)).ConfigureAwait(false); foreach (var f in fixes) { CodeDiagnosticDescriptor.RunAction(DocumentContext, f.Action, default(CancellationToken)); } } ); subMenu.Add(menuItem); menu.Add(subMenu); items++; } foreach (var fix_ in GetCurrentFixes().DiagnosticsAtCaret) { var fix = fix_; var label = GettextCatalog.GetString("_Options for \"{0}\"", fix.GetMessage()); var subMenu = new FixMenuDescriptor(label); CodeDiagnosticDescriptor descriptor = BuiltInCodeDiagnosticProvider.GetCodeDiagnosticDescriptor(fix.Id); if (descriptor == null) { continue; } if (first) { menu.Add(FixMenuEntry.Separator); first = false; } // if (inspector.CanSuppressWithAttribute) { // var menuItem = new FixMenuEntry (GettextCatalog.GetString ("_Suppress with attribute"), // delegate { // // inspector.SuppressWithAttribute (Editor, DocumentContext, GetTextSpan (fix.Item2)); // }); // subMenu.Add (menuItem); // } if (descriptor.CanDisableWithPragma) { var menuItem = new FixMenuEntry(GettextCatalog.GetString("_Suppress with #pragma"), delegate { descriptor.DisableWithPragma(Editor, DocumentContext, fix); }); subMenu.Add(menuItem); menuItem = new FixMenuEntry(GettextCatalog.GetString("_Suppress with file"), delegate { descriptor.DisableWithFile(Editor, DocumentContext, fix); }); subMenu.Add(menuItem); } var optionsMenuItem = new FixMenuEntry(GettextCatalog.GetString("_Configure Rule"), delegate { IdeApp.Workbench.ShowGlobalPreferencesDialog(null, "C#", dialog => { var panel = dialog.GetPanel <CodeIssuePanel> ("C#"); if (panel == null) { return; } panel.Widget.SelectCodeIssue(descriptor.IdString); }); }); subMenu.Add(optionsMenuItem); foreach (var fix2 in GetCurrentFixes().CodeFixActions.OrderByDescending(i => Tuple.Create(IsAnalysisOrErrorFix(i.CodeAction), (int)0, GetUsage(i.CodeAction.EquivalenceKey)))) { var provider = fix2.Diagnostic.GetCodeFixProvider().GetFixAllProvider(); if (provider == null) { continue; } if (!provider.GetSupportedFixAllScopes().Contains(FixAllScope.Document)) { continue; } var subMenu2 = new FixMenuDescriptor(GettextCatalog.GetString("Fix all")); var diagnosticAnalyzer = fix2.Diagnostic.GetCodeDiagnosticDescriptor(LanguageNames.CSharp).GetProvider(); if (!diagnosticAnalyzer.SupportedDiagnostics.Contains(fix.Descriptor)) { continue; } var menuItem = new FixMenuEntry( GettextCatalog.GetString("In _Document"), async delegate { var fixAllDiagnosticProvider = new FixAllDiagnosticProvider(diagnosticAnalyzer.SupportedDiagnostics.Select(d => d.Id).ToImmutableHashSet(), async(Microsoft.CodeAnalysis.Document doc, ImmutableHashSet <string> diagnostics, CancellationToken token) => { var model = await doc.GetSemanticModelAsync(token); var compilationWithAnalyzer = model.Compilation.WithAnalyzers(new [] { diagnosticAnalyzer }.ToImmutableArray(), null, token); return(await compilationWithAnalyzer.GetAnalyzerSemanticDiagnosticsAsync(model, null, token)); }, (Project arg1, bool arg2, ImmutableHashSet <string> arg3, CancellationToken arg4) => { return(Task.FromResult((IEnumerable <Diagnostic>) new Diagnostic [] { })); }); var ctx = new FixAllContext( this.DocumentContext.AnalysisDocument, fix2.Diagnostic.GetCodeFixProvider(), FixAllScope.Document, fix2.CodeAction.EquivalenceKey, diagnosticAnalyzer.SupportedDiagnostics.Select(d => d.Id), fixAllDiagnosticProvider, default(CancellationToken) ); var fixAll = await provider.GetFixAsync(ctx); using (var undo = Editor.OpenUndoGroup()) { CodeDiagnosticDescriptor.RunAction(DocumentContext, fixAll, default(CancellationToken)); } }); subMenu2.Add(menuItem); subMenu.Add(FixMenuEntry.Separator); subMenu.Add(subMenu2); } menu.Add(subMenu); items++; } }
protected override void Run() { var lang = "text/x-csharp"; OpenFileDialog dlg = new OpenFileDialog("Export Rules", MonoDevelop.Components.FileChooserAction.Save); dlg.InitialFileName = "rules.html"; if (!dlg.Run()) { return; } Dictionary <CodeDiagnosticDescriptor, DiagnosticSeverity?> severities = new Dictionary <CodeDiagnosticDescriptor, DiagnosticSeverity?> (); foreach (var node in BuiltInCodeDiagnosticProvider.GetBuiltInCodeDiagnosticDecsriptorsAsync(CodeRefactoringService.MimeTypeToLanguage(lang), true).Result) { severities [node] = node.DiagnosticSeverity; // if (node.GetProvider ().SupportedDiagnostics.Length > 1) { // foreach (var subIssue in node.GetProvider ().SupportedDiagnostics) { // severities [subIssue] = node.GetSeverity (subIssue); // } // } } var grouped = severities.Keys.OfType <CodeDiagnosticDescriptor> () .GroupBy(node => node.GetProvider().SupportedDiagnostics.First().Category) .OrderBy(g => g.Key, StringComparer.Ordinal); using (var sw = new StreamWriter(dlg.SelectedFile)) { sw.WriteLine("<h1>Code Rules</h1>"); foreach (var g in grouped) { sw.WriteLine("<h2>" + g.Key + "</h2>"); sw.WriteLine("<table border='1'>"); foreach (var node in g.OrderBy(n => n.Name, StringComparer.Ordinal)) { var title = node.Name; var desc = node.GetProvider().SupportedDiagnostics.First().Description.ToString() != title?node.GetProvider().SupportedDiagnostics.First().Description : ""; sw.WriteLine("<tr><td>" + title + "</td><td>" + desc + "</td><td>" + node.DiagnosticSeverity + "</td></tr>"); if (node.GetProvider().SupportedDiagnostics.Length > 1) { foreach (var subIssue in node.GetProvider().SupportedDiagnostics) { title = subIssue.Description.ToString(); desc = subIssue.Description.ToString() != title ? subIssue.Description : ""; sw.WriteLine("<tr><td> - " + title + "</td><td>" + desc + "</td><td>" + node.GetSeverity(subIssue) + "</td></tr>"); } } } sw.WriteLine("</table>"); } var providerStates = new Dictionary <CodeRefactoringDescriptor, bool> (); foreach (var node in BuiltInCodeDiagnosticProvider.GetBuiltInCodeRefactoringDescriptorsAsync(CodeRefactoringService.MimeTypeToLanguage(lang), true).Result) { providerStates [node] = node.IsEnabled; } sw.WriteLine("<h1>Code Actions</h1>"); sw.WriteLine("<table border='1'>"); var sortedAndFiltered = providerStates.Keys.OrderBy(n => n.Name, StringComparer.Ordinal); foreach (var node in sortedAndFiltered) { sw.WriteLine("<tr><td>" + node.IdString + "</td><td>" + node.Name + "</td></tr>"); } sw.WriteLine("</table>"); } }