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)); } } }
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)); } } }
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)); } } }
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)); } } }
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); } }
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); } }
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)); } } }
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)); } } }
public void SetMenuItemOnStart() { SelectedMenuItem = NoteMenuItems.FirstOrDefault(); _noteNavigationService.NavigateTo(SelectedMenuItem.Tag); }
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)); } } }