private static void AddOptionalAccessor(IMethodSymbol?accessor, ApiEntry parent) { if (accessor is null) { return; } var entry = ApiEntry.Create(accessor, parent); parent.Children.Add(entry); }
private static void AddType(ApiEntry parent, ITypeSymbol symbol) { if (!symbol.IsIncludedInCatalog()) { return; } var apiEntry = ApiEntry.Create(symbol, parent); parent.Children.Add(apiEntry); foreach (var member in symbol.GetMembers()) { AddMember(apiEntry, member); } }
private static List <ApiEntry> GetApis(IAssemblySymbol symbol) { var result = new List <ApiEntry>(); var types = symbol.GetAllTypes() .Where(t => t.IsIncludedInCatalog()) .GroupBy(t => t.ContainingNamespace, SymbolEqualityComparer.Default); foreach (var namespaceGroup in types) { var entry = ApiEntry.Create(namespaceGroup.Key); result.Add(entry); foreach (var type in namespaceGroup) { AddType(entry, type); } } return(result); }
private static void AddMember(ApiEntry parent, ISymbol symbol) { if (symbol is INamedTypeSymbol type) { AddType(parent, type); return; } if (!symbol.IsIncludedInCatalog()) { return; } // We don't want to include accessors at the type level; we'll add them as children // under properties and events. if (symbol.IsAccessor()) { return; } var entry = ApiEntry.Create(symbol, parent); parent.Children.Add(entry); switch (symbol) { case IPropertySymbol property: AddOptionalAccessor(property.GetMethod, entry); AddOptionalAccessor(property.SetMethod, entry); break; case IEventSymbol @event: AddOptionalAccessor(@event.AddMethod, entry); AddOptionalAccessor(@event.RemoveMethod, entry); AddOptionalAccessor(@event.RaiseMethod, entry); break; } }