コード例 #1
0
        protected override async Task UpdateAsync(CommandArrayInfo info, CancellationToken cancelToken)
        {
            var editor = IdeApp.Workbench.ActiveDocument?.Editor;
            var ext    = editor?.GetContent <CodeActionEditorExtension> ();

            if (ext == null)
            {
                return;
            }
            var quickFixMenu = new CommandInfoSet();

            quickFixMenu.Text = GettextCatalog.GetString("Quick Fix");
            quickFixMenu.CommandInfos.Add(new CommandInfo(GettextCatalog.GetString("Loading..."), false, false), null);
            info.Add(quickFixMenu);
            try {
                var menu = await CodeFixMenuService.CreateFixMenu(editor, ext.GetCurrentFixes(), cancelToken);

                quickFixMenu.CommandInfos.Clear();
                foreach (var item in menu.Items)
                {
                    AddItem(quickFixMenu, item);
                }
                if (menu.Items.Count == 0)
                {
                    quickFixMenu.CommandInfos.Add(new CommandInfo(GettextCatalog.GetString("No code fixes available"), false, false), null);
                }
            } catch (OperationCanceledException) {
            } catch (Exception e) {
                LoggingService.LogError("Error while creating quick fix menu.", e);
                quickFixMenu.CommandInfos.Clear();
                quickFixMenu.CommandInfos.Add(new CommandInfo(GettextCatalog.GetString("No code fixes available"), false, false), null);
            }
        }
コード例 #2
0
 void AddItem(CommandArrayInfo cis, CodeFixMenuEntry item)
 {
     if (item == CodeFixMenuEntry.Separator)
     {
         if (cis.Count == 0)
         {
             return;
         }
         cis.AddSeparator();
     }
     else if (item is CodeFixMenu)
     {
         var menu    = (CodeFixMenu)item;
         var submenu = new CommandInfoSet {
             Text = menu.Label
         };
         foreach (var subItem in menu.Items)
         {
             AddItem(submenu.CommandInfos, subItem);
         }
         cis.Add(submenu, item.Action);
     }
     else
     {
         var info = new CommandInfo(item.Label);
         info.Enabled = item.Action != null;
         cis.Add(info, item.Action);
     }
 }
        /// <summary>
        /// The Update method is used to determine if the command can run within the current context.
        ///
        /// Note that we have overriden the Update which provides a CommandArrayInfo object; in the
        /// manifest we provided 'array' to the type attribute. This specifies to the command engine that
        /// this command provides multiple choices that the user can execute.
        ///
        /// We provide a CommandInfoSet object into the provided CommandArrayInfo to specify all the choices
        /// are user can make when running our command; we provide multiple 'CommandInfos' to specify what the user
        /// can execute.
        /// </summary>
        /// <param name="info">Info.</param>
        protected override void Update(CommandArrayInfo info)
        {
            if (PropertyService.HasValue(PropertyKeys.TranslationApiPropertyKey) == false)
            {
                return;                 // Can't run
            }

            var doc = IdeApp.Workbench.ActiveDocument;

            var editor = doc.Editor;

            if (doc != null &&
                editor != null)
            {
                var loc = editor.CaretLocation;
                Microsoft.CodeAnalysis.SyntaxToken token;
                if (SyntaxTokenHelper.ResolveSyntaxToken(doc, loc, out token))
                {
                    var commandSet = new CommandInfoSet();

                    commandSet.CommandInfos.Add(new CommandInfo("English"), new TranslationSetting("en", token));
                    commandSet.CommandInfos.Add(new CommandInfo("German"), new TranslationSetting("de", token));
                    commandSet.CommandInfos.Add(new CommandInfo("Spanish"), new TranslationSetting("es", token));
                    commandSet.CommandInfos.Add(new CommandInfo("French"), new TranslationSetting("fr", token));

                    info.Add(commandSet);
                }
            }
        }
コード例 #4
0
        protected override void Update(CommandArrayInfo ainfo)
        {
            var doc = IdeApp.Workbench.ActiveDocument;

            if (doc == null || doc.FileName == FilePath.Null || doc.ParsedDocument == null)
            {
                return;
            }

            ResolveResult resolveResult;
            AstNode       node;

            if (!ResolveAt(doc, out resolveResult, out node))
            {
                return;
            }

            var resolveMenu = new CommandInfoSet();

            resolveMenu.Text = GettextCatalog.GetString("Resolve");

            var possibleNamespaces = GetPossibleNamespaces(doc, node, resolveResult);

            bool addUsing = !(resolveResult is AmbiguousTypeResolveResult);

            if (addUsing)
            {
                foreach (string ns in possibleNamespaces)
                {
                    var info = resolveMenu.CommandInfos.Add(
                        string.Format("using {0};", ns),
                        new System.Action(new AddImport(doc, resolveResult, ns, true).Run)
                        );
                    info.Icon = MonoDevelop.Ide.Gui.Stock.AddNamespace;
                }
            }

            bool resolveDirect = !(resolveResult is UnknownMemberResolveResult);

            if (resolveDirect)
            {
                if (resolveMenu.CommandInfos.Count > 0)
                {
                    resolveMenu.CommandInfos.AddSeparator();
                }
                if (node is ObjectCreateExpression)
                {
                    node = ((ObjectCreateExpression)node).Type;
                }
                foreach (string ns in possibleNamespaces)
                {
                    resolveMenu.CommandInfos.Add(string.Format("{0}", ns + "." + doc.Editor.GetTextBetween(node.StartLocation, node.EndLocation)), new System.Action(new AddImport(doc, resolveResult, ns, false).Run));
                }
            }

            if (resolveMenu.CommandInfos.Count > 0)
            {
                ainfo.Insert(0, resolveMenu);
            }
        }
コード例 #5
0
ファイル: ViewCommands.cs プロジェクト: thild/monodevelop
        protected override void Update(CommandArrayInfo info)
        {
            for (int i = 0; i < IdeApp.Workbench.Pads.Count; i++)
            {
                Pad pad = IdeApp.Workbench.Pads[i];

                CommandInfo ci = new CommandInfo(pad.Title);
                ci.Icon        = pad.Icon;
                ci.UseMarkup   = true;
                ci.Description = GettextCatalog.GetString("Show {0}", pad.Title);
                ci.Checked     = pad.Visible;

                ActionCommand cmd = IdeApp.CommandService.GetActionCommand("Pad|" + pad.Id);
                if (cmd != null)
                {
                    ci.AccelKey = cmd.AccelKey;
                }

                CommandArrayInfo list = info;
                if (pad.Categories != null)
                {
                    for (int j = 0; j < pad.Categories.Length; j++)
                    {
                        bool found = false;
                        for (int k = list.Count - 1; k >= 0; k--)
                        {
                            if (list[k].Text == pad.Categories[j] && list[k] is CommandInfoSet)
                            {
                                list  = ((CommandInfoSet)list[k]).CommandInfos;
                                found = true;
                                break;
                            }
                        }
                        if (!found)
                        {
                            CommandInfoSet set = new CommandInfoSet();
                            set.Text        = pad.Categories[j];
                            set.Description = GettextCatalog.GetString("Show {0}", set.Text);
                            list.Add(set);
                            list = set.CommandInfos;
                        }
                    }
                }
                for (int j = list.Count - 1; j >= 0; j--)
                {
                    if (!(list[j] is CommandInfoSet))
                    {
                        list.Insert(j + 1, ci, pad);
                        pad = null;
                        break;
                    }
                }
                if (pad != null)
                {
                    list.Insert(0, ci, pad);
                }
            }
        }
コード例 #6
0
        CommandInfoSet CreateCommandInfoSet(CodeFixMenu menu)
        {
            var cis = new CommandInfoSet();

            cis.Text = menu.Label;
            foreach (var item in menu.Items)
            {
                AddItem(cis.CommandInfos, item);
            }
            return(cis);
        }
コード例 #7
0
 void AddItem(CommandInfoSet cis, CodeFixMenuEntry item)
 {
     if (item == CodeFixMenuEntry.Separator)
     {
         if (cis.CommandInfos.Count == 0)
         {
             return;
         }
         cis.CommandInfos.AddSeparator();
     }
     else
     {
         cis.CommandInfos.Add(new CommandInfo(item.Label), item.Action);
     }
 }
コード例 #8
0
        protected override void Update(CommandArrayInfo ainfo)
        {
            var doc = IdeApp.Workbench.ActiveDocument;

            if (doc == null || doc.FileName == FilePath.Null || doc.ParsedDocument == null)
            {
                return;
            }

            ResolveResult resolveResult;
            AstNode       node;

            if (!ResolveAt(doc, out resolveResult, out node))
            {
                var location = RefactoringService.GetCorrectResolveLocation(doc, doc.Editor.Caret.Location);
                resolveResult = GetHeuristicResult(doc, location, ref node);
                if (resolveResult == null)
                {
                    return;
                }
            }
            var resolveMenu = new CommandInfoSet();

            resolveMenu.Text = GettextCatalog.GetString("Resolve");

            var possibleNamespaces = GetPossibleNamespaces(doc, node, ref resolveResult);

            bool addUsing = !(resolveResult is AmbiguousTypeResolveResult);

            if (addUsing)
            {
                foreach (var t in possibleNamespaces.Where(tp => tp.IsAccessibleWithGlobalUsing))
                {
                    string ns        = t.Namespace;
                    var    reference = t.Reference;
                    var    info      = resolveMenu.CommandInfos.Add(
                        t.GetImportText(),
                        new System.Action(new AddImport(doc, resolveResult, ns, reference, true, node).Run)
                        );
                    info.Icon = MonoDevelop.Ide.Gui.Stock.AddNamespace;
                }
            }

            bool resolveDirect = !(resolveResult is UnknownMemberResolveResult);

            if (resolveDirect)
            {
                if (resolveMenu.CommandInfos.Count > 0)
                {
                    resolveMenu.CommandInfos.AddSeparator();
                }
                if (node is ObjectCreateExpression)
                {
                    node = ((ObjectCreateExpression)node).Type;
                }
                foreach (var t in possibleNamespaces)
                {
                    string ns        = t.Namespace;
                    var    reference = t.Reference;
                    resolveMenu.CommandInfos.Add(t.GetInsertNamespaceText(doc.Editor.GetTextBetween(node.StartLocation, node.EndLocation)), new System.Action(new AddImport(doc, resolveResult, ns, reference, false, node).Run));
                }
            }

            if (resolveMenu.CommandInfos.Count > 0)
            {
                ainfo.Insert(0, resolveMenu);
            }
        }
コード例 #9
0
        protected override async Task UpdateAsync(CommandArrayInfo ainfo, CancellationToken cancelToken)
        {
            if (!TryGetDocument(out var analysisDocument, out var doc))
            {
                return;
            }
            var semanticModel = await analysisDocument.GetSemanticModelAsync(cancelToken);

            if (semanticModel == null)
            {
                return;
            }
            var info = await RefactoringSymbolInfo.GetSymbolInfoAsync(doc.DocumentContext, doc.Editor, cancelToken);

            var ext = doc.GetContent <CodeActionEditorExtension> ();

            bool canRename = RenameHandler.CanRename(info.Symbol ?? info.DeclaredSymbol);

            if (canRename)
            {
                ainfo.Add(IdeApp.CommandService.GetCommandInfo(MonoDevelop.Ide.Commands.EditCommands.Rename), new Action(async delegate {
                    await new MonoDevelop.Refactoring.Rename.RenameRefactoring().Rename(info.Symbol ?? info.DeclaredSymbol);
                }));
            }

            bool isSortAndRemoveUsingsSupported = RemoveAndSortUsingsHandler.IsSortAndRemoveImportsSupported(analysisDocument, doc.GetContent <Microsoft.VisualStudio.Text.ITextBuffer>());

            if (isSortAndRemoveUsingsSupported)
            {
                var sortAndRemoveImportsInfo = IdeApp.CommandService.GetCommandInfo(Commands.SortAndRemoveImports);
                sortAndRemoveImportsInfo.Enabled = true;
                ainfo.Add(sortAndRemoveImportsInfo, new Action(async delegate {
                    await RemoveAndSortUsingsHandler.SortAndRemoveUnusedImports(analysisDocument, cancelToken);
                }));
            }

            var gotoDeclarationSymbol = info.Symbol;

            if (gotoDeclarationSymbol == null && info.DeclaredSymbol != null && info.DeclaredSymbol.Locations.Length > 1)
            {
                gotoDeclarationSymbol = info.DeclaredSymbol;
            }
            if (IdeApp.ProjectOperations.CanJumpToDeclaration(gotoDeclarationSymbol) || gotoDeclarationSymbol == null && IdeApp.ProjectOperations.CanJumpToDeclaration(info.CandidateSymbols.FirstOrDefault()))
            {
                var type = (gotoDeclarationSymbol ?? info.CandidateSymbols.FirstOrDefault()) as INamedTypeSymbol;
                if (type != null && type.Locations.Length > 1)
                {
                    var declSet = new CommandInfoSet();
                    declSet.Text = GettextCatalog.GetString("_Go to Declaration");
                    foreach (var part in type.Locations)
                    {
                        var loc = part.GetLineSpan();
                        declSet.CommandInfos.Add(string.Format(GettextCatalog.GetString("{0}, Line {1}"), FormatFileName(part.SourceTree.FilePath), loc.StartLinePosition.Line + 1), new Action(() => IdeApp.ProjectOperations.JumpTo(type, part, doc.Owner)));
                    }
                    ainfo.Add(declSet);
                }
                else
                {
                    ainfo.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.GotoDeclaration), new Action(() => GotoDeclarationHandler.Run(doc)));
                }
            }


            if (info.DeclaredSymbol != null && GotoBaseDeclarationHandler.CanGotoBase(info.DeclaredSymbol))
            {
                ainfo.Add(GotoBaseDeclarationHandler.GetDescription(info.DeclaredSymbol), new Action(() => GotoBaseDeclarationHandler.GotoBase(doc, info.DeclaredSymbol).Ignore()));
            }

            var sym = info.Symbol ?? info.DeclaredSymbol;

            if (doc.DocumentContext.HasProject && sym != null)
            {
                ainfo.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.FindReferences), new System.Action(() => {
                    if (sym.Kind == SymbolKind.Local || sym.Kind == SymbolKind.Parameter || sym.Kind == SymbolKind.TypeParameter)
                    {
                        FindReferencesHandler.FindRefs(new [] { SymbolAndProjectId.Create(sym, analysisDocument.Project.Id) }, analysisDocument.Project.Solution).Ignore();
                    }
                    else
                    {
                        RefactoringService.FindReferencesAsync(FindReferencesHandler.FilterSymbolForFindReferences(sym).GetDocumentationCommentId()).Ignore();
                    }
                }));
                try {
                    if (Microsoft.CodeAnalysis.FindSymbols.SymbolFinder.FindSimilarSymbols(sym, semanticModel.Compilation).Count() > 1)
                    {
                        ainfo.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.FindAllReferences), new System.Action(() => RefactoringService.FindAllReferencesAsync(FindReferencesHandler.FilterSymbolForFindReferences(sym).GetDocumentationCommentId())));
                    }
                } catch (Exception) {
                    // silently ignore roslyn bug.
                }
            }
        }
コード例 #10
0
        protected override void Update(CommandArrayInfo ainfo)
        {
            var doc = IdeApp.Workbench.ActiveDocument;

            if (doc == null || doc.FileName == FilePath.Null)
            {
                return;
            }

            var parsedDocument = doc.ParsedDocument;

            if (parsedDocument == null || parsedDocument.IsInvalid)
            {
                return;
            }

            ResolveResult resolveResult;
            object        item  = GetItem(doc, out resolveResult);
            bool          added = false;

            var options = new RefactoringOptions(doc)
            {
                ResolveResult = resolveResult,
                SelectedItem  = item
            };

            var ciset = new CommandInfoSet();

            ciset.Text = GettextCatalog.GetString("Refactor");

            bool canRename;

            if (item is IVariable || item is IParameter)
            {
                canRename = true;
            }
            else if (item is ITypeDefinition)
            {
                canRename = !((ITypeDefinition)item).Region.IsEmpty;
            }
            else if (item is IType)
            {
                canRename = ((IType)item).Kind == TypeKind.TypeParameter;
            }
            else if (item is IMember)
            {
                canRename = !((IMember)item).Region.IsEmpty;
            }
            else if (item is INamespace)
            {
                canRename = true;
            }
            else
            {
                canRename = false;
            }
            if (canRename)
            {
                ciset.CommandInfos.Add(IdeApp.CommandService.GetCommandInfo(MonoDevelop.Ide.Commands.EditCommands.Rename), new Action(delegate {
                    new MonoDevelop.Refactoring.Rename.RenameHandler().Start(null);
                }));
                added = true;
            }

            foreach (var refactoring in RefactoringService.Refactorings)
            {
                if (refactoring.IsValid(options))
                {
                    CommandInfo info = new CommandInfo(refactoring.GetMenuDescription(options));
                    info.AccelKey = refactoring.AccelKey;
                    ciset.CommandInfos.Add(info, new Action(new RefactoringOperationWrapper(refactoring, options).Operation));
                }
            }
            var refactoringInfo = doc.Annotation <RefactoringDocumentInfo> ();

            if (refactoringInfo == null)
            {
                refactoringInfo = new RefactoringDocumentInfo();
                doc.AddAnnotation(refactoringInfo);
            }
            var  loc   = doc.Editor.Caret.Location;
            bool first = true;

            if (refactoringInfo.lastDocument != doc.ParsedDocument || loc != lastLocation)
            {
                if (QuickTaskStrip.EnableFancyFeatures)
                {
                    var ext = doc.GetContent <CodeActionEditorExtension> ();
                    refactoringInfo.validActions = ext != null?ext.GetCurrentFixes() : null;
                }
                else
                {
                    refactoringInfo.validActions = RefactoringService.GetValidActions(doc, loc).Result;
                }

                lastLocation = loc;
                refactoringInfo.lastDocument = doc.ParsedDocument;
            }
            if (refactoringInfo.validActions != null && refactoringInfo.lastDocument != null && refactoringInfo.lastDocument.CreateRefactoringContext != null)
            {
                var context = refactoringInfo.lastDocument.CreateRefactoringContext(doc, CancellationToken.None);

                foreach (var fix_ in refactoringInfo.validActions.OrderByDescending(i => Tuple.Create(CodeActionEditorExtension.IsAnalysisOrErrorFix(i), (int)i.Severity, CodeActionEditorExtension.GetUsage(i.IdString))))
                {
                    if (CodeActionEditorExtension.IsAnalysisOrErrorFix(fix_))
                    {
                        continue;
                    }
                    var fix = fix_;
                    if (first)
                    {
                        first = false;
                        if (ciset.CommandInfos.Count > 0)
                        {
                            ciset.CommandInfos.AddSeparator();
                        }
                    }

                    ciset.CommandInfos.Add(fix.Title, new Action(() => RefactoringService.ApplyFix(fix, context)));
                }
            }

            if (ciset.CommandInfos.Count > 0)
            {
                ainfo.Add(ciset, null);
                added = true;
            }

            if (IdeApp.ProjectOperations.CanJumpToDeclaration(item))
            {
                var type = item as IType;
                if (type != null && type.GetDefinition().Parts.Count > 1)
                {
                    var declSet = new CommandInfoSet();
                    declSet.Text = GettextCatalog.GetString("_Go to Declaration");
                    var ct = type.GetDefinition();
                    foreach (var part in ct.Parts)
                    {
                        declSet.CommandInfos.Add(string.Format(GettextCatalog.GetString("{0}, Line {1}"), FormatFileName(part.Region.FileName), part.Region.BeginLine), new System.Action(new JumpTo(part).Run));
                    }
                    ainfo.Add(declSet);
                }
                else
                {
                    ainfo.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.GotoDeclaration), new System.Action(new JumpTo(item).Run));
                }
                added = true;
            }

            if (item is IMember)
            {
                var member = (IMember)item;
                if (member.IsOverride || member.ImplementedInterfaceMembers.Any())
                {
                    ainfo.Add(GettextCatalog.GetString("Go to _Base Symbol"), new System.Action(new GotoBase(member).Run));
                    added = true;
                }
            }

            if (!(item is IMethod && ((IMethod)item).SymbolKind == SymbolKind.Operator) && (item is IEntity || item is ITypeParameter || item is IVariable || item is INamespace))
            {
                ainfo.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.FindReferences), new System.Action(new FindRefs(item, false).Run));
                if (doc.HasProject && HasOverloads(doc.Project.ParentSolution, item))
                {
                    ainfo.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.FindAllReferences), new System.Action(new FindRefs(item, true).Run));
                }
                added = true;
            }

            if (item is IMember)
            {
                var member = (IMember)item;
                if (member.IsVirtual || member.IsAbstract || member.DeclaringType.Kind == TypeKind.Interface)
                {
                    var handler = new FindDerivedSymbolsHandler(doc, member);
                    if (handler.IsValid)
                    {
                        ainfo.Add(GettextCatalog.GetString("Find Derived Symbols"), new System.Action(handler.Run));
                        added = true;
                    }
                }
            }
            if (item is IMember)
            {
                var member = (IMember)item;
                if (member.SymbolKind == SymbolKind.Method || member.SymbolKind == SymbolKind.Indexer)
                {
                    var findMemberOverloadsHandler = new FindMemberOverloadsHandler(doc, member);
                    if (findMemberOverloadsHandler.IsValid)
                    {
                        ainfo.Add(GettextCatalog.GetString("Find Member Overloads"), new System.Action(findMemberOverloadsHandler.Run));
                        added = true;
                    }
                }
            }

            if (item is ITypeDefinition)
            {
                ITypeDefinition cls = (ITypeDefinition)item;
                foreach (var bc in cls.DirectBaseTypes)
                {
                    if (bc != null && bc.GetDefinition() != null && bc.GetDefinition().Kind != TypeKind.Interface /* TODO: && IdeApp.ProjectOperations.CanJumpToDeclaration (bc)*/)
                    {
                        ainfo.Add(GettextCatalog.GetString("Go to _Base"), new System.Action(new GotoBase((ITypeDefinition)item).Run));
                        break;
                    }
                }
                if ((cls.Kind == TypeKind.Class && !cls.IsSealed) || cls.Kind == TypeKind.Interface)
                {
                    ainfo.Add(cls.Kind != TypeKind.Interface ? GettextCatalog.GetString("Find _derived classes") : GettextCatalog.GetString("Find _implementor classes"), new System.Action(new FindDerivedClasses(cls).Run));
                }
                ainfo.Add(GettextCatalog.GetString("Find Extension Methods"), new System.Action(new FindExtensionMethodHandler(doc, cls).Run));
                added = true;
            }

            if (added)
            {
                ainfo.AddSeparator();
            }
        }
コード例 #11
0
ファイル: MacMainMenu.cs プロジェクト: zheref/monodevelop
        static void BuildDynamicSubMenu(IntPtr rootMenu, IntPtr parentMenu, ushort index, uint macCmdID, CommandInfoSet cinfoSet)
        {
            IntPtr menuRef = HIToolbox.CreateMenu(idSeq++, GetCleanCommandText(cinfoSet), MenuAttributes.CondenseSeparators);

            objectsToDestroyOnMenuClose.Add(new DestructableMenu(menuRef));
            HIToolbox.CheckResult(HIToolbox.SetMenuItemHierarchicalMenu(parentMenu, index, menuRef));

            ushort count = (ushort)cinfoSet.CommandInfos.Count;

            for (ushort i = 1, j = 0; i <= count; i++)
            {
                CommandInfo ci = cinfoSet.CommandInfos[j++];
                if (ci.IsArraySeparator)
                {
                    HIToolbox.AppendMenuSeparator(menuRef);
                }
                else
                {
                    HIToolbox.AppendMenuItem(menuRef, ci.Text, 0, macCmdID);
                    UpdateMenuItem(rootMenu, menuRef, ref i, ref count, macCmdID, ci);

                    objectsToDestroyOnMenuClose.Add(ci.DataItem);
                    uint refcon = (uint)objectsToDestroyOnMenuClose.Count;
                    HIToolbox.SetMenuItemReferenceConstant(new HIMenuItem(menuRef, i), refcon);
                }
            }
        }
コード例 #12
0
        protected override void Update(CommandArrayInfo ainfo)
        {
            var doc = IdeApp.Workbench.ActiveDocument;

            if (doc == null || doc.FileName == FilePath.Null || doc.ParsedDocument == null)
            {
                return;
            }
            var semanticModel = doc.ParsedDocument.GetAst <SemanticModel> ();

            if (semanticModel == null)
            {
                return;
            }
            var task = RefactoringSymbolInfo.GetSymbolInfoAsync(doc, doc.Editor);

            if (!task.Wait(2000))
            {
                return;
            }
            var  info  = task.Result;
            bool added = false;

            var ext = doc.GetContent <CodeActionEditorExtension> ();

            //if (ext != null) {
            //	var fixMenu = CreateFixMenu (doc.Editor, doc, semanticModel, ext.GetCurrentFixes ());
            //	if (fixMenu.CommandInfos.Count > 0) {
            //		ainfo.Add (fixMenu, null);
            //		added = true;
            //	}
            //}
            var ciset = new CommandInfoSet();

            ciset.Text = GettextCatalog.GetString("Refactor");

            bool canRename = RenameHandler.CanRename(info.Symbol ?? info.DeclaredSymbol);

            if (canRename)
            {
                ciset.CommandInfos.Add(IdeApp.CommandService.GetCommandInfo(MonoDevelop.Ide.Commands.EditCommands.Rename), new Action(async delegate {
                    await new MonoDevelop.Refactoring.Rename.RenameRefactoring().Rename(info.Symbol ?? info.DeclaredSymbol);
                }));
                added = true;
            }
            bool first = true;

            //if (ext != null) {
            //	foreach (var fix in ext.GetCurrentFixes ().CodeRefactoringActions) {
            //		if (added & first && ciset.CommandInfos.Count > 0)
            //			ciset.CommandInfos.AddSeparator ();
            //		var info2 = new CommandInfo (fix.CodeAction.Title);
            //		ciset.CommandInfos.Add (info2, new Action (async () => await new CodeActionEditorExtension.ContextActionRunner (fix.CodeAction, doc.Editor, doc).Run ()));
            //		added = true;
            //		first = false;
            //	}
            //}

            if (ciset.CommandInfos.Count > 0)
            {
                ainfo.Add(ciset, null);
                added = true;
            }

            var gotoDeclarationSymbol = info.Symbol;

            if (gotoDeclarationSymbol == null && info.DeclaredSymbol != null && info.DeclaredSymbol.Locations.Length > 1)
            {
                gotoDeclarationSymbol = info.DeclaredSymbol;
            }
            if (IdeApp.ProjectOperations.CanJumpToDeclaration(gotoDeclarationSymbol) || gotoDeclarationSymbol == null && IdeApp.ProjectOperations.CanJumpToDeclaration(info.CandidateSymbols.FirstOrDefault()))
            {
                var type = (gotoDeclarationSymbol ?? info.CandidateSymbols.FirstOrDefault()) as INamedTypeSymbol;
                if (type != null && type.Locations.Length > 1)
                {
                    var declSet = new CommandInfoSet();
                    declSet.Text = GettextCatalog.GetString("_Go to Declaration");
                    foreach (var part in type.Locations)
                    {
                        var loc = part.GetLineSpan();
                        declSet.CommandInfos.Add(string.Format(GettextCatalog.GetString("{0}, Line {1}"), FormatFileName(part.SourceTree.FilePath), loc.StartLinePosition.Line + 1), new Action(() => IdeApp.ProjectOperations.JumpTo(type, part, doc.Project)));
                    }
                    ainfo.Add(declSet);
                }
                else
                {
                    ainfo.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.GotoDeclaration), new Action(() => GotoDeclarationHandler.Run(doc)));
                }
                added = true;
            }


            if (info.DeclaredSymbol != null && GotoBaseDeclarationHandler.CanGotoBase(info.DeclaredSymbol))
            {
                ainfo.Add(GotoBaseDeclarationHandler.GetDescription(info.DeclaredSymbol), new Action(() => GotoBaseDeclarationHandler.GotoBase(doc, info.DeclaredSymbol)));
                added = true;
            }

            var sym = info.Symbol ?? info.DeclaredSymbol;

            if (doc.HasProject && sym != null)
            {
                ainfo.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.FindReferences), new System.Action(() => {
                    if (sym.Kind == SymbolKind.Local || sym.Kind == SymbolKind.Parameter || sym.Kind == SymbolKind.TypeParameter)
                    {
                        FindReferencesHandler.FindRefs(sym);
                    }
                    else
                    {
                        RefactoringService.FindReferencesAsync(FindReferencesHandler.FilterSymbolForFindReferences(sym).GetDocumentationCommentId());
                    }
                }));
                try {
                    if (Microsoft.CodeAnalysis.FindSymbols.SymbolFinder.FindSimilarSymbols(sym, semanticModel.Compilation).Count() > 1)
                    {
                        ainfo.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.FindAllReferences), new System.Action(() => RefactoringService.FindAllReferencesAsync(FindReferencesHandler.FilterSymbolForFindReferences(sym).GetDocumentationCommentId())));
                    }
                } catch (Exception) {
                    // silently ignore roslyn bug.
                }
            }
            added = true;
        }
コード例 #13
0
        protected override void Update(CommandArrayInfo info)
        {
            if (caps.Update())
            {
                if (caps.resultResolutionAttempt != LooseResolution.NodeResolutionAttempt.RawSymbolLookup)
                {
                    var refactoringMenu = new CommandInfoSet {
                        Text = GettextCatalog.GetString("Refactoring")
                    };

                    if (caps.lastResults.Any(t => t is DSymbol && DRenameRefactoring.CanRenameNode((t as DSymbol).Definition)))
                    {
                        refactoringMenu.CommandInfos.Add(IdeApp.CommandService.GetCommandInfo(EditCommands.Rename), new Action(caps.RenameSymbol));
                    }

                    if (refactoringMenu.CommandInfos.Count > 0)
                    {
                        info.Add(refactoringMenu);
                    }

                    info.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.GotoDeclaration), new Action(caps.GotoDeclaration));
                    info.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.FindReferences), new Action(() => caps.FindReferences(false)));

                    if (caps.lastResults.Any(t => t is DSymbol && (t as DSymbol).Definition.Parent is DClassLike))
                    {
                        info.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.FindAllReferences), new Action(() => caps.FindReferences(true)));
                    }

                    if (caps.lastResults.Any(t => {
                        var ds = DResolver.StripMemberSymbols(t);
                        return(ds is ClassType || ds is InterfaceType);
                    }))
                    {
                        info.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.FindDerivedClasses), new Action(caps.FindDerivedClasses));
                    }
                }
                else
                {
                    var importSymbolMenu = new CommandInfoSet {
                        Text = GettextCatalog.GetString("Resolve")
                    };

                    foreach (var m in caps.GetImportableModulesForLastResults())
                    {
                        importSymbolMenu.CommandInfos.Add(new CommandInfo {
                            Text = "import " + AbstractNode.GetNodePath(m, true) + ";",
                            Icon = MonoDevelop.Ide.Gui.Stock.AddNamespace
                        }, new object[] { RefactoryCommands.ImportSymbol, m });
                    }

                    if (importSymbolMenu.CommandInfos.Count > 0)
                    {
                        importSymbolMenu.CommandInfos.AddSeparator();

                        var alreadyAddedItems = new List <DModule> ();
                        foreach (var t in caps.lastResults)
                        {
                            var n = DResolver.GetResultMember(t, true);
                            if (n == null)
                            {
                                continue;
                            }
                            var m = n.NodeRoot as DModule;
                            if (m != null && !alreadyAddedItems.Contains(m))
                            {
                                alreadyAddedItems.Add(m);

                                importSymbolMenu.CommandInfos.Add(new CommandInfo {
                                    Text = AbstractNode.GetNodePath(n, true)
                                }, new object[] { RefactoryCommands.QuickFix, n });
                            }
                        }


                        // To explicitly show the Ctrl+Alt+Space hint.
                        importSymbolMenu.CommandInfos.AddSeparator();
                        importSymbolMenu.CommandInfos.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.ImportSymbol), new Action(caps.TryImportMissingSymbol));

                        info.Add(importSymbolMenu);
                    }
                }
            }

            if (SortImportsCommandHandler.CanSortImports(caps.lastDoc))
            {
                info.Add(IdeApp.CommandService.GetCommandInfo(RefactoryCommands.SortImports), new Action(() => SortImportsCommandHandler.SortImports(caps.lastDoc)));
            }
        }
コード例 #14
0
        public static void PopulateInfos(CommandArrayInfo infos, Document doc, IEnumerable <FixableResult> results)
        {
            //FIXME: ellipsize long messages
            int mnemonic = 1;

            var codeActionExtension = doc.GetContent <CodeActionEditorExtension> ();
            var fixes = codeActionExtension.GetCurrentFixes();

            if (fixes != null)
            {
                foreach (var _fix in fixes.Where(CodeActionWidget.IsAnalysisOrErrorFix))
                {
                    var fix = _fix;
                    if (fix is AnalysisContextActionProvider.AnalysisCodeAction)
                    {
                        continue;
                    }
                    var escapedLabel = fix.Title.Replace("_", "__");
                    var label        = (mnemonic <= 10)
                                                ? "_" + (mnemonic++ % 10).ToString() + " " + escapedLabel
                                                        : "  " + escapedLabel;
                    infos.Add(label, fix);
                }
            }

            foreach (var result in results)
            {
                bool firstAction = true;
                foreach (var action in GetActions(doc, result))
                {
                    if (firstAction)
                    {
                        //FIXME: make this header item insensitive but not greyed out
                        infos.Add(new CommandInfo(result.Message.Replace("_", "__"), false, false)
                        {
                            Icon = GetIcon(result.Level)
                        }, null);
                        firstAction = false;
                    }
                    var escapedLabel = action.Label.Replace("_", "__");
                    var label        = (mnemonic <= 10)
                                                ? "_" + (mnemonic++ % 10).ToString() + " " + escapedLabel
                                                : "  " + escapedLabel;
                    infos.Add(label, action);
                }
                if (result.HasOptionsDialog)
                {
                    var declSet = new CommandInfoSet();
                    declSet.Text = GettextCatalog.GetString("_Options for \"{0}\"", result.OptionsTitle);

                    bool hasBatchFix = false;
                    foreach (var fix in result.Fixes.OfType <IAnalysisFixAction> ().Where(f => f.SupportsBatchFix))
                    {
                        hasBatchFix = true;
                        var title = string.Format(GettextCatalog.GetString("Apply in file: {0}"), fix.Label);
                        declSet.CommandInfos.Add(title, new System.Action(fix.BatchFix));
                    }
                    if (hasBatchFix)
                    {
                        declSet.CommandInfos.AddSeparator();
                    }

                    var ir = result as InspectorResults;
                    if (ir != null)
                    {
                        var inspector = ir.Inspector;

                        if (inspector.CanSuppressWithAttribute)
                        {
                            declSet.CommandInfos.Add(GettextCatalog.GetString("_Suppress with attribute"), new System.Action(delegate {
                                inspector.SuppressWithAttribute(doc, ir.Region);
                            }));
                        }

                        if (inspector.CanDisableWithPragma)
                        {
                            declSet.CommandInfos.Add(GettextCatalog.GetString("_Suppress with #pragma"), new System.Action(delegate {
                                inspector.DisableWithPragma(doc, ir.Region);
                            }));
                        }

                        if (inspector.CanDisableOnce)
                        {
                            declSet.CommandInfos.Add(GettextCatalog.GetString("_Disable once with comment"), new System.Action(delegate {
                                inspector.DisableOnce(doc, ir.Region);
                            }));
                        }

                        if (inspector.CanDisableAndRestore)
                        {
                            declSet.CommandInfos.Add(GettextCatalog.GetString("Disable _and restore with comments"), new System.Action(delegate {
                                inspector.DisableAndRestore(doc, ir.Region);
                            }));
                        }
                    }

                    declSet.CommandInfos.Add(GettextCatalog.GetString("_Configure inspection"), result);

                    infos.Add(declSet);
                }
            }
        }
コード例 #15
0
        public static void PopulateInfos(CommandArrayInfo infos, Document doc, IEnumerable <FixableResult> results)
        {
            //FIXME: ellipsize long messages
            int mnemonic = 1;

            foreach (var result in results)
            {
                bool firstAction = true;
                foreach (var action in GetActions(doc, result))
                {
                    if (firstAction)
                    {
                        //FIXME: make this header item insensitive but not greyed out
                        infos.Add(new CommandInfo(result.Message.Replace("_", "__"), false, false)
                        {
                            Icon = GetIcon(result.Level)
                        }, null);
                        firstAction = false;
                    }
                    var escapedLabel = action.Label.Replace("_", "__");
                    var label        = (mnemonic <= 10)
                                                ? "_" + (mnemonic++ % 10).ToString() + " " + escapedLabel
                                                : "  " + escapedLabel;
                    infos.Add(label, action);
                }
                if (result.HasOptionsDialog)
                {
                    var declSet = new CommandInfoSet();
                    declSet.Text = GettextCatalog.GetString("_Options for \"{0}\"", result.OptionsTitle);

                    var ir = result as InspectorResults;
                    if (ir != null)
                    {
                        var inspector = ir.Inspector;

                        if (inspector.CanSuppressWithAttribute)
                        {
                            declSet.CommandInfos.Add(GettextCatalog.GetString("_Suppress with attribute"), new System.Action(delegate {
                                inspector.SuppressWithAttribute(doc, ir.Region);
                            }));
                        }

                        if (inspector.CanDisableWithPragma)
                        {
                            declSet.CommandInfos.Add(GettextCatalog.GetString("_Suppress with #pragma"), new System.Action(delegate {
                                inspector.DisableWithPragma(doc, ir.Region);
                            }));
                        }

                        if (inspector.CanDisableOnce)
                        {
                            declSet.CommandInfos.Add(GettextCatalog.GetString("_Disable once with comment"), new System.Action(delegate {
                                inspector.DisableOnce(doc, ir.Region);
                            }));
                        }

                        if (inspector.CanDisableAndRestore)
                        {
                            declSet.CommandInfos.Add(GettextCatalog.GetString("Disable _and restore with comments"), new System.Action(delegate {
                                inspector.DisableAndRestore(doc, ir.Region);
                            }));
                        }
                    }

                    declSet.CommandInfos.Add(GettextCatalog.GetString("_Configure inspection severity"), result);

                    infos.Add(declSet);
                }
            }
        }
コード例 #16
0
        protected override void Update(CommandArrayInfo info)
        {
            string group;
            var    lastListGroup = new Dictionary <CommandArrayInfo, string>();
            var    descFormat    = GettextCatalog.GetString("Show {0}");

            foreach (Pad pad in IdeApp.Workbench.Pads.OrderBy(p => p.Group, StringComparer.InvariantCultureIgnoreCase))
            {
                CommandInfo ci = new CommandInfo(pad.Title);
                ci.Icon        = pad.Icon;
                ci.UseMarkup   = true;
                ci.Description = string.Format(descFormat, pad.Title);
                // We only want these commands enabled if the main window is visible
                ci.Enabled = IdeApp.Workbench.RootWindow.Visible;

                ActionCommand cmd = IdeApp.CommandService.GetActionCommand("Pad|" + pad.Id);
                if (cmd != null)
                {
                    ci.AccelKey = cmd.AccelKey;
                }

                CommandArrayInfo list = info;
                if (pad.Categories != null)
                {
                    for (int j = 0; j < pad.Categories.Length; j++)
                    {
                        bool found = false;
                        for (int k = list.Count - 1; k >= 0; k--)
                        {
                            if (list[k].Text == pad.Categories[j] && list[k] is CommandInfoSet)
                            {
                                list  = ((CommandInfoSet)list[k]).CommandInfos;
                                found = true;
                                break;
                            }
                        }
                        if (!found)
                        {
                            CommandInfoSet set = new CommandInfoSet();
                            set.Text        = pad.Categories[j];
                            set.Description = string.Format(descFormat, set.Text);
                            list.Add(set);
                            list = set.CommandInfos;
                        }
                    }
                }

                int atIndex = 0;
                for (int j = list.Count - 1; j >= 0; j--)
                {
                    if (!(list [j] is CommandInfoSet))
                    {
                        atIndex = j + 1;
                        break;
                    }
                }

                list.Insert(atIndex, ci, pad);
                lastListGroup.TryGetValue(list, out group);
                if (group != pad.Group)
                {
                    lastListGroup [list] = pad.Group;
                    if (atIndex > 0)
                    {
                        CommandInfo sep = new CommandInfo("-");
                        sep.IsArraySeparator = true;
                        list.Insert(atIndex, sep, null);
                    }
                }
            }
        }
コード例 #17
0
        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);
        }