Beispiel #1
0
 void SortAndGroupSymbolByClass(MenuItem menuItem, List <ISymbol> members)
 {
     members.Sort((a, b) => {
         var s = a.ContainingType.Name.CompareTo(b.ContainingType.Name);
         return(s != 0 ? s : a.Name.CompareTo(b.Name));
     });
     if (members.Count < 10)
     {
         foreach (var member in members)
         {
             menuItem.Items.Add(new SymbolMenuItem(this, member, member.Locations)
             {
                 Header = new TextBlock().Append(member.ContainingType.Name + ".", System.Windows.Media.Brushes.Gray).Append(member.Name)
             });
         }
     }
     else
     {
         SymbolMenuItem   subMenu    = null;
         INamedTypeSymbol typeSymbol = null;
         foreach (var member in members)
         {
             if (typeSymbol == null || typeSymbol != member.ContainingType)
             {
                 typeSymbol = member.ContainingType;
                 subMenu    = new SymbolMenuItem(this, typeSymbol, null);
                 menuItem.Items.Add(subMenu);
             }
             subMenu.Items.Add(new SymbolMenuItem(this, member, member.Locations));
         }
     }
 }
Beispiel #2
0
        void FindReferences(MenuItem menuItem, ISymbol source)
        {
            var refs = SymbolFinder.FindReferencesAsync(source, _Document.Project.Solution, System.Collections.Immutable.ImmutableHashSet.CreateRange(_Document.Project.GetRelatedDocuments())).Result.ToArray();

            Array.Sort(refs, (a, b) => {
                int s;
                return(0 != (s = a.Definition.ContainingType.Name.CompareTo(b.Definition.ContainingType.Name)) ? s :
                       0 != (s = b.Definition.DeclaredAccessibility - a.Definition.DeclaredAccessibility) ? s
                                        : a.Definition.Name.CompareTo(b.Definition.Name));
            });
            if (refs.Length < 10)
            {
                foreach (var item in refs)
                {
                    menuItem.Items.Add(new SymbolMenuItem(this, item.Definition, item.Definition.ContainingType?.Name + "." + item.Definition.Name, null));
                }
            }
            else
            {
                SymbolMenuItem   subMenu    = null;
                INamedTypeSymbol typeSymbol = null;
                foreach (var item in refs)
                {
                    if (typeSymbol == null || typeSymbol != item.Definition.ContainingType)
                    {
                        typeSymbol = item.Definition.ContainingType;
                        subMenu    = new SymbolMenuItem(this, typeSymbol, null);
                        menuItem.Items.Add(subMenu);
                    }
                    subMenu.Items.Add(new SymbolMenuItem(this, item.Definition, null));
                }
            }
        }
Beispiel #3
0
        void FindCallers(MenuItem menuItem, ISymbol source)
        {
            var docs = System.Collections.Immutable.ImmutableHashSet.CreateRange(_Document.Project.GetRelatedDocuments());

            SymbolCallerInfo[] callers;
            switch (source.Kind)
            {
            case SymbolKind.Method:
            case SymbolKind.Property:
            case SymbolKind.Event:
                callers = SymbolFinder.FindCallersAsync(source, _Document.Project.Solution, docs).Result.ToArray();
                break;

            case SymbolKind.NamedType:
                var tempResults = new HashSet <SymbolCallerInfo>(SymbolCallerInfoComparer.Instance);
                foreach (var item in (source as INamedTypeSymbol).InstanceConstructors)
                {
                    foreach (var c in SymbolFinder.FindCallersAsync(item, _Document.Project.Solution, docs).Result)
                    {
                        tempResults.Add(c);
                    }
                }
                tempResults.CopyTo(callers = new SymbolCallerInfo[tempResults.Count]);
                break;

            default: return;
            }
            Array.Sort(callers, (a, b) => {
                var s = a.CallingSymbol.ContainingType.Name.CompareTo(b.CallingSymbol.ContainingType.Name);
                return(s != 0 ? s : a.CallingSymbol.Name.CompareTo(b.CallingSymbol.Name));
            });
            if (callers.Length < 10)
            {
                foreach (var caller in callers)
                {
                    var s = caller.CallingSymbol;
                    menuItem.Items.Add(new SymbolMenuItem(this, s, caller.Locations)
                    {
                        Header = new TextBlock().Append(s.ContainingType.Name + ".", System.Windows.Media.Brushes.Gray).Append(s.Name)
                    });
                }
            }
            else
            {
                SymbolMenuItem   subMenu    = null;
                INamedTypeSymbol typeSymbol = null;
                foreach (var caller in callers)
                {
                    var s = caller.CallingSymbol;
                    if (typeSymbol == null || typeSymbol != s.ContainingType)
                    {
                        typeSymbol = s.ContainingType;
                        subMenu    = new SymbolMenuItem(this, typeSymbol, null);
                        menuItem.Items.Add(subMenu);
                    }
                    subMenu.Items.Add(new SymbolMenuItem(this, s, caller.Locations));
                }
            }
        }
Beispiel #4
0
        void FindMembers(CommandContext context, MenuItem menuItem, ISymbol symbol)
        {
            var type = symbol as INamedTypeSymbol;
            var ct   = context.CancellationToken;

            if (type != null)
            {
                if (type.TypeKind == TypeKind.Class)
                {
                    while ((type = type.BaseType) != null && type.IsCommonClass() == false)
                    {
                        if (ct.IsCancellationRequested)
                        {
                            return;
                        }
                        var baseTypeItem = new SymbolMenuItem(this, type, type.ToDisplayString(WpfHelper.MemberNameFormat) + " (base class)", null);
                        menuItem.Items.Add(baseTypeItem);
                        AddSymbolMembers(this, baseTypeItem, type, ct);
                    }
                }
                else if (type.TypeKind == TypeKind.Interface)
                {
                    foreach (var item in type.AllInterfaces)
                    {
                        if (ct.IsCancellationRequested)
                        {
                            return;
                        }
                        var baseInterface = new SymbolMenuItem(this, item, item.ToDisplayString(WpfHelper.MemberNameFormat) + " (base interface)", null);
                        menuItem.Items.Add(baseInterface);
                        AddSymbolMembers(this, baseInterface, item, ct);
                    }
                }
            }
            AddSymbolMembers(this, menuItem, symbol, ct);
            void AddSymbolMembers(SmartBar bar, MenuItem menu, ISymbol source, CancellationToken token)
            {
                var nsOrType = source as INamespaceOrTypeSymbol;
                var members  = nsOrType.GetMembers().RemoveAll(m => m.CanBeReferencedByName == false);

                if (source.Kind == SymbolKind.NamedType && (source as INamedTypeSymbol).TypeKind == TypeKind.Enum)
                {
                    // sort enum members by value
                    members = members.Sort(CodeAnalysisHelper.CompareByFieldIntegerConst);
                }
                else
                {
                    members = members.Sort(CodeAnalysisHelper.CompareByAccessibilityKindName);
                }
                foreach (var item in members)
                {
                    if (token.IsCancellationRequested)
                    {
                        break;
                    }
                    menu.Items.Add(new SymbolMenuItem(bar, item, item.Locations));
                }
            }
        }
Beispiel #5
0
        void FindDerivedClasses(MenuItem menuItem, ISymbol symbol)
        {
            var classes = SymbolFinder.FindDerivedClassesAsync(symbol as INamedTypeSymbol, _Document.Project.Solution).Result.ToArray();

            Array.Sort(classes, (a, b) => a.Name.CompareTo(b.Name));
            foreach (var derived in classes)
            {
                var item = new SymbolMenuItem(this, derived, derived.Locations);
                if (derived.GetSourceLocations().Length == 0)
                {
                    (item.Header as TextBlock).Foreground = System.Windows.Media.Brushes.Gray;
                }
                menuItem.Items.Add(item);
            }
        }
Beispiel #6
0
        void FindDerivedClasses(CommandContext context, MenuItem menuItem, ISymbol symbol)
        {
            var classes = ThreadHelper.JoinableTaskFactory.Run(() => SymbolFinder.FindDerivedClassesAsync(symbol as INamedTypeSymbol, _Context.Document.Project.Solution, null, context.CancellationToken)).ToArray();

            Array.Sort(classes, (a, b) => a.Name.CompareTo(b.Name));
            foreach (var derived in classes)
            {
                var item = new SymbolMenuItem(this, derived, derived.Locations);
                if (derived.GetSourceLocations().Length == 0)
                {
                    (item.Header as TextBlock).Foreground = WpfBrushes.Gray;
                }
                menuItem.Items.Add(item);
            }
        }
Beispiel #7
0
 void SortAndGroupSymbolByClass(MenuItem menuItem, List <ISymbol> members)
 {
     members.Sort(CompareSymbol);
     if (members.Count < 10)
     {
         foreach (var member in members)
         {
             menuItem.Items.Add(new SymbolMenuItem(this, member, member.Locations)
             {
                 Header = (member.ContainingType != null
                                                 ? new TextBlock().Append(member.ContainingType.Name + ".", WpfBrushes.Gray)
                                                 : new TextBlock())
                          .Append(member.Name)
             });
         }
     }
     else
     {
         SymbolMenuItem   subMenu    = null;
         INamedTypeSymbol typeSymbol = null;
         foreach (var member in members)
         {
             if (typeSymbol == null || typeSymbol != member.ContainingType)
             {
                 typeSymbol = member.ContainingType ?? member as INamedTypeSymbol;
                 if (typeSymbol != null)
                 {
                     subMenu = new SymbolMenuItem(this, typeSymbol, typeSymbol.Locations);
                     menuItem.Items.Add(subMenu);
                     if (typeSymbol == member)
                     {
                         continue;
                     }
                 }
                 else
                 {
                     continue;
                 }
             }
             subMenu.Items.Add(new SymbolMenuItem(this, member, member.Locations));
         }
     }
 }
Beispiel #8
0
        void FindMembers(MenuItem menuItem, ISymbol symbol)
        {
            var type = symbol as INamedTypeSymbol;

            if (type != null && type.TypeKind == TypeKind.Class)
            {
                while ((type = type.BaseType) != null && type.IsCommonClass() == false)
                {
                    var baseTypeItem = new SymbolMenuItem(this, type, type.ToDisplayString(__MemberNameFormat) + " (base class)", null);
                    menuItem.Items.Add(baseTypeItem);
                    AddSymbolMembers(this, baseTypeItem, type);
                }
            }
            AddSymbolMembers(this, menuItem, symbol);
            void AddSymbolMembers(SmartBar bar, MenuItem menu, ISymbol source)
            {
                var nsOrType = source as INamespaceOrTypeSymbol;
                var members  = nsOrType
                               .GetMembers()
                               .RemoveAll(m => m.CanBeReferencedByName == false)
                               .Sort(Comparer <ISymbol> .Create((a, b) => {
                    int s;
                    if ((s = b.DeclaredAccessibility - a.DeclaredAccessibility) != 0 ||                          // sort by visibility first
                        (s = a.Kind - b.Kind) != 0)                                      // then by member kind
                    {
                        return(s);
                    }
                    return(a.Name.CompareTo(b.Name));
                }));

                foreach (var item in members)
                {
                    menu.Items.Add(new SymbolMenuItem(bar, item, item.Locations));
                }
            }
        }
Beispiel #9
0
 public void SetMenuItemOnStart()
 {
     SelectedMenuItem = NoteMenuItems.FirstOrDefault();
     _noteNavigationService.NavigateTo(SelectedMenuItem.Tag);
 }
Beispiel #10
0
        void FindCallers(CommandContext context, MenuItem menuItem, ISymbol source)
        {
            var doc  = _Context.Document;
            var docs = System.Collections.Immutable.ImmutableHashSet.CreateRange(doc.Project.GetRelatedProjectDocuments());

            SymbolCallerInfo[] callers;
            switch (source.Kind)
            {
            case SymbolKind.Method:
            case SymbolKind.Property:
            case SymbolKind.Event:
                callers = ThreadHelper.JoinableTaskFactory.Run(() => SymbolFinder.FindCallersAsync(source, doc.Project.Solution, docs, context.CancellationToken)).ToArray();
                break;

            case SymbolKind.NamedType:
                var tempResults = new HashSet <SymbolCallerInfo>(SymbolCallerInfoComparer.Instance);
                ThreadHelper.JoinableTaskFactory.Run(async() => {
                    foreach (var item in (source as INamedTypeSymbol).InstanceConstructors)
                    {
                        foreach (var c in await SymbolFinder.FindCallersAsync(item, doc.Project.Solution, docs, context.CancellationToken))
                        {
                            tempResults.Add(c);
                        }
                    }
                });
                tempResults.CopyTo(callers = new SymbolCallerInfo[tempResults.Count]);
                break;

            default: return;
            }
            Array.Sort(callers, (a, b) => {
                return(CompareSymbol(a.CallingSymbol, b.CallingSymbol));
            });
            if (callers.Length < 10)
            {
                foreach (var caller in callers)
                {
                    var s = caller.CallingSymbol;
                    menuItem.Items.Add(new SymbolMenuItem(this, s, caller.Locations)
                    {
                        Header = new TextBlock().Append(s.ContainingType.Name + ".", WpfBrushes.Gray).Append(s.Name)
                    });
                }
            }
            else
            {
                SymbolMenuItem   subMenu    = null;
                INamedTypeSymbol typeSymbol = null;
                foreach (var caller in callers)
                {
                    var s = caller.CallingSymbol;
                    if (typeSymbol == null || typeSymbol != s.ContainingType)
                    {
                        typeSymbol = s.ContainingType;
                        subMenu    = new SymbolMenuItem(this, typeSymbol, null);
                        menuItem.Items.Add(subMenu);
                    }
                    subMenu.Items.Add(new SymbolMenuItem(this, s, caller.Locations));
                }
            }
        }