コード例 #1
0
		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, delegate {
					new ContextActionRunner (fix.CodeAction, Editor, DocumentContext).Run (null, EventArgs.Empty);
					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, delegate {
					new ContextActionRunner (fix.CodeAction, Editor, DocumentContext).Run (null, EventArgs.Empty);
					ConfirmUsage (fix.CodeAction.EquivalenceKey);
				});
				menu.Add (thisInstanceMenuItem);
				items++;
			}

			first = false;
			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++;
			}
		}
コード例 #2
0
        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++;
            }
        }
コード例 #3
0
        void PopulateFixes(FixMenuDescriptor menu, ref int items)
        {
            if (!RefactoringService.ShowFixes)
            {
                return;
            }
            int  mnemonic = 1;
            bool gotImportantFix = false, addedSeparator = false;
            var  fixesAdded = new List <string> ();

            foreach (var fix_ in Fixes.OrderByDescending(i => Tuple.Create(IsAnalysisOrErrorFix(i), (int)i.Severity, GetUsage(i.IdString))))
            {
                // filter out code actions that are already resolutions of a code issue
                if (fixesAdded.Any(f => fix_.IdString.IndexOf(f, StringComparison.Ordinal) >= 0))
                {
                    continue;
                }
                fixesAdded.Add(fix_.IdString);
                if (IsAnalysisOrErrorFix(fix_))
                {
                    gotImportantFix = true;
                }
                if (!addedSeparator && gotImportantFix && !IsAnalysisOrErrorFix(fix_))
                {
                    menu.Add(FixMenuEntry.Separator);
                    addedSeparator = true;
                }

                var fix          = fix_;
                var escapedLabel = fix.Title.Replace("_", "__");
                var label        = (mnemonic <= 10)
                                        ? "_" + (mnemonic++ % 10).ToString() + " " + escapedLabel
                                        : "  " + escapedLabel;
                var thisInstanceMenuItem = new FixMenuEntry(label, delegate {
                    new ContextActionRunner(fix, document, currentSmartTagBegin).Run(null, EventArgs.Empty);
                    ConfirmUsage(fix.IdString);
                });
                menu.Add(thisInstanceMenuItem);
                items++;
            }

            bool first             = true;
            var  settingsMenuFixes = Fixes
                                     .OfType <AnalysisContextActionProvider.AnalysisCodeAction> ()
                                     .Where(f => f.Result is InspectorResults)
                                     .GroupBy(f => ((InspectorResults)f.Result).Inspector);

            foreach (var analysisFixGroup_ in settingsMenuFixes)
            {
                var analysisFixGroup    = analysisFixGroup_;
                var arbitraryFixInGroup = analysisFixGroup.First();
                var ir = (InspectorResults)arbitraryFixInGroup.Result;

                if (first)
                {
                    menu.Add(FixMenuEntry.Separator);
                    first = false;
                }

                var subMenu = new FixMenuDescriptor();
                foreach (var analysisFix_ in analysisFixGroup)
                {
                    var analysisFix = analysisFix_;
                    if (analysisFix.SupportsBatchRunning)
                    {
                        var batchRunMenuItem = new FixMenuEntry(
                            string.Format(GettextCatalog.GetString("Apply in file: {0}"), analysisFix.Title),
                            delegate {
                            ConfirmUsage(analysisFix.IdString);
                            new ContextActionRunner(analysisFix, document, this.currentSmartTagBegin).BatchRun(null, EventArgs.Empty);
                        }
                            );
                        subMenu.Add(batchRunMenuItem);
                        subMenu.Add(FixMenuEntry.Separator);
                    }
                }

                var inspector = ir.Inspector;
                if (inspector.CanSuppressWithAttribute)
                {
                    var menuItem = new FixMenuEntry(GettextCatalog.GetString("_Suppress with attribute"),
                                                    delegate {
                        inspector.SuppressWithAttribute(document, arbitraryFixInGroup.DocumentRegion);
                    });
                    subMenu.Add(menuItem);
                }

                if (inspector.CanDisableWithPragma)
                {
                    var menuItem = new FixMenuEntry(GettextCatalog.GetString("_Suppress with #pragma"),
                                                    delegate {
                        inspector.DisableWithPragma(document, arbitraryFixInGroup.DocumentRegion);
                    });
                    subMenu.Add(menuItem);
                }

                if (inspector.CanDisableOnce)
                {
                    var menuItem = new FixMenuEntry(GettextCatalog.GetString("_Disable Once"),
                                                    delegate {
                        inspector.DisableOnce(document, arbitraryFixInGroup.DocumentRegion);
                    });
                    subMenu.Add(menuItem);
                }

                if (inspector.CanDisableAndRestore)
                {
                    var menuItem = new FixMenuEntry(GettextCatalog.GetString("Disable _and Restore"),
                                                    delegate {
                        inspector.DisableAndRestore(document, arbitraryFixInGroup.DocumentRegion);
                    });
                    subMenu.Add(menuItem);
                }
                var label       = GettextCatalog.GetString("_Options for \"{0}\"", InspectorResults.GetTitle(ir.Inspector));
                var subMenuItem = new FixMenuDescriptor(label);

                var optionsMenuItem = new FixMenuEntry(GettextCatalog.GetString("_Configure Rule"),
                                                       delegate {
                    arbitraryFixInGroup.ShowOptions(null, EventArgs.Empty);
                });
                subMenuItem.Add(optionsMenuItem);

                menu.Add(subMenuItem);
                items++;
            }
        }
コード例 #4
0
        void PopupQuickFixMenu(Gdk.EventButton evt, Action <FixMenuDescriptor> menuAction)
        {
            FixMenuDescriptor menu = new FixMenuDescriptor();
            var           fixMenu  = menu;
            ResolveResult resolveResult;

            ICSharpCode.NRefactory.CSharp.AstNode node;
            int items = 0;

            if (ResolveCommandHandler.ResolveAt(document, out resolveResult, out node))
            {
                var possibleNamespaces = MonoDevelop.Refactoring.ResolveCommandHandler.GetPossibleNamespaces(
                    document,
                    node,
                    ref resolveResult
                    );

                foreach (var t in possibleNamespaces.Where(tp => tp.OnlyAddReference))
                {
                    menu.Add(new FixMenuEntry(t.GetImportText(), delegate {
                        new ResolveCommandHandler.AddImport(document, resolveResult, null, t.Reference, true, node).Run();
                    }));
                    items++;
                }

                bool addUsing = !(resolveResult is AmbiguousTypeResolveResult);
                if (addUsing)
                {
                    foreach (var t in possibleNamespaces.Where(tp => tp.IsAccessibleWithGlobalUsing))
                    {
                        string ns        = t.Namespace;
                        var    reference = t.Reference;
                        menu.Add(new FixMenuEntry(t.GetImportText(),
                                                  delegate {
                            new ResolveCommandHandler.AddImport(document, resolveResult, ns, reference, true, node).Run();
                        })
                                 );
                        items++;
                    }
                }

                bool resolveDirect = !(resolveResult is UnknownMemberResolveResult);
                if (resolveDirect)
                {
                    foreach (var t in possibleNamespaces)
                    {
                        string ns        = t.Namespace;
                        var    reference = t.Reference;
                        menu.Add(new FixMenuEntry(t.GetInsertNamespaceText(document.Editor.GetTextBetween(node.StartLocation, node.EndLocation)),
                                                  delegate {
                            new ResolveCommandHandler.AddImport(document, resolveResult, ns, reference, false, node).Run();
                        }));
                        items++;
                    }
                }

                if (menu.Items.Any() && Fixes.Any())
                {
                    fixMenu = new FixMenuDescriptor(GettextCatalog.GetString("Quick Fixes"));
                    menu.Add(fixMenu);
                    items++;
                }
            }
            PopulateFixes(fixMenu, ref items);
            if (items == 0)
            {
                return;
            }
            document.Editor.SuppressTooltips = true;
            document.Editor.Parent.HideTooltip();
            if (menuAction != null)
            {
                menuAction(menu);
            }
            var container = document.Editor.Parent;

            var p    = container.LocationToPoint(currentSmartTagBegin);
            var rect = new Gdk.Rectangle(
                p.X + container.Allocation.X,
                p.Y + (int)document.Editor.LineHeight + container.Allocation.Y, 0, 0);

            ShowFixesMenu(document.Editor.Parent, rect, menu);
        }
コード例 #5
0
		void PopulateFixes (FixMenuDescriptor menu, ref int items)
		{
			if (!RefactoringService.ShowFixes)
				return;
			int mnemonic = 1;
			bool gotImportantFix = false, addedSeparator = false;
			var fixesAdded = new List<string> ();
			foreach (var fix_ in Fixes.OrderByDescending (i => Tuple.Create (IsAnalysisOrErrorFix(i), (int)i.Severity, GetUsage (i.IdString)))) {
				// filter out code actions that are already resolutions of a code issue
				if (fixesAdded.Any (f => fix_.IdString.IndexOf (f, StringComparison.Ordinal) >= 0))
					continue;
				fixesAdded.Add (fix_.IdString);
				if (IsAnalysisOrErrorFix (fix_))
					gotImportantFix = true;
				if (!addedSeparator && gotImportantFix && !IsAnalysisOrErrorFix(fix_)) {
					menu.Add (FixMenuEntry.Separator);
					addedSeparator = true;
				}

				var fix = fix_;
				var escapedLabel = fix.Title.Replace ("_", "__");
				var label = (mnemonic <= 10)
					? "_" + (mnemonic++ % 10).ToString () + " " + escapedLabel
					: "  " + escapedLabel;
				var thisInstanceMenuItem = new FixMenuEntry (label, delegate {
					new ContextActionRunner (fix, document, currentSmartTagBegin).Run (null, EventArgs.Empty);
					ConfirmUsage (fix.IdString);
				});
				menu.Add (thisInstanceMenuItem);
				items++;
			}

			bool first = true;
			var settingsMenuFixes = Fixes
				.OfType<AnalysisContextActionProvider.AnalysisCodeAction> ()
				.Where (f => f.Result is InspectorResults)
				.GroupBy (f => ((InspectorResults)f.Result).Inspector);
			foreach (var analysisFixGroup_ in settingsMenuFixes) {
				var analysisFixGroup = analysisFixGroup_;
				var arbitraryFixInGroup = analysisFixGroup.First ();
				var ir = (InspectorResults)arbitraryFixInGroup.Result;

				if (first) {
					menu.Add (FixMenuEntry.Separator);
					first = false;
				}

				var subMenu = new FixMenuDescriptor ();
				foreach (var analysisFix_ in analysisFixGroup) {
					var analysisFix = analysisFix_;
					if (analysisFix.SupportsBatchRunning) {
						var batchRunMenuItem = new FixMenuEntry (
							string.Format (GettextCatalog.GetString ("Apply in file: {0}"), analysisFix.Title), 
							delegate {
								ConfirmUsage (analysisFix.IdString);
								new ContextActionRunner (analysisFix, document, this.currentSmartTagBegin).BatchRun (null, EventArgs.Empty);
							}
						);
						subMenu.Add (batchRunMenuItem);
						subMenu.Add (FixMenuEntry.Separator);
					}
				}

				var inspector = ir.Inspector;
				if (inspector.CanSuppressWithAttribute) {
					var menuItem = new FixMenuEntry (GettextCatalog.GetString ("_Suppress with attribute"),
						delegate {
							inspector.SuppressWithAttribute (document, arbitraryFixInGroup.DocumentRegion); 
						});
					subMenu.Add (menuItem);
				}

				if (inspector.CanDisableWithPragma) {
					var menuItem = new FixMenuEntry (GettextCatalog.GetString ("_Suppress with #pragma"),
						delegate {
							inspector.DisableWithPragma (document, arbitraryFixInGroup.DocumentRegion); 
						});
					subMenu.Add (menuItem);
				}

				if (inspector.CanDisableOnce) {
					var menuItem = new FixMenuEntry (GettextCatalog.GetString ("_Disable Once"),
						delegate {
							inspector.DisableOnce (document, arbitraryFixInGroup.DocumentRegion); 
						});
					subMenu.Add (menuItem);
				}

				if (inspector.CanDisableAndRestore) {
					var menuItem = new FixMenuEntry (GettextCatalog.GetString ("Disable _and Restore"),
						delegate {
							inspector.DisableAndRestore (document, arbitraryFixInGroup.DocumentRegion); 
						});
					subMenu.Add (menuItem);
				}
				var label = GettextCatalog.GetString ("_Options for \"{0}\"", InspectorResults.GetTitle (ir.Inspector));
				var subMenuItem = new FixMenuDescriptor (label);

				var optionsMenuItem = new FixMenuEntry (GettextCatalog.GetString ("_Configure Rule"),
					delegate {
						arbitraryFixInGroup.ShowOptions (null, EventArgs.Empty);
					});
				subMenuItem.Add (optionsMenuItem);

				menu.Add (subMenuItem);
				items++;
			}
		}
コード例 #6
0
		void PopupQuickFixMenu (Gdk.EventButton evt, Action<FixMenuDescriptor> menuAction)
		{
			FixMenuDescriptor menu = new FixMenuDescriptor ();
			var fixMenu = menu;
			ResolveResult resolveResult;
			ICSharpCode.NRefactory.CSharp.AstNode node;
			int items = 0;
			if (ResolveCommandHandler.ResolveAt (document, out resolveResult, out node)) {
				var possibleNamespaces = MonoDevelop.Refactoring.ResolveCommandHandler.GetPossibleNamespaces (
					document,
					node,
					ref resolveResult
				);

				foreach (var t in possibleNamespaces.Where (tp => tp.OnlyAddReference)) {
					menu.Add (new FixMenuEntry (t.GetImportText (), delegate {
						new ResolveCommandHandler.AddImport (document, resolveResult, null, t.Reference, true, node).Run ();
					}));
					items++;
				}

				bool addUsing = !(resolveResult is AmbiguousTypeResolveResult);
				if (addUsing) {
					foreach (var t in possibleNamespaces.Where (tp => tp.IsAccessibleWithGlobalUsing)) {
						string ns = t.Namespace;
						var reference = t.Reference;
						menu.Add (new FixMenuEntry (t.GetImportText (), 
							delegate {
								new ResolveCommandHandler.AddImport (document, resolveResult, ns, reference, true, node).Run ();
							})
						);
						items++;
					}
				}

				bool resolveDirect = !(resolveResult is UnknownMemberResolveResult);
				if (resolveDirect) {
					foreach (var t in possibleNamespaces) {
						string ns = t.Namespace;
						var reference = t.Reference;
						menu.Add (new FixMenuEntry (t.GetInsertNamespaceText (document.Editor.GetTextBetween (node.StartLocation, node.EndLocation)),
							delegate {
							new ResolveCommandHandler.AddImport (document, resolveResult, ns, reference, false, node).Run ();
						}));
						items++;
					}
				}

				if (menu.Items.Any () && Fixes.Any ()) {
					fixMenu = new FixMenuDescriptor (GettextCatalog.GetString ("Quick Fixes"));
					menu.Add (fixMenu);
					items++;
				}
			}
			PopulateFixes (fixMenu, ref items);
			if (items == 0) {
				return;
			}
			document.Editor.SuppressTooltips = true;
			document.Editor.Parent.HideTooltip ();
			if (menuAction != null)
				menuAction (menu);
			var container = document.Editor.Parent;

			var p = container.LocationToPoint (currentSmartTagBegin);
			var rect = new Gdk.Rectangle (
				p.X + container.Allocation.X , 
				p.Y + (int)document.Editor.LineHeight + container.Allocation.Y, 0, 0);

			ShowFixesMenu (document.Editor.Parent, rect, menu);
		}