예제 #1
0
    private static void AddOptionalAccessor(IMethodSymbol?accessor, ApiEntry parent)
    {
        if (accessor is null)
        {
            return;
        }

        var entry = ApiEntry.Create(accessor, parent);

        parent.Children.Add(entry);
    }
예제 #2
0
    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);
        }
    }
예제 #3
0
    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);
    }
예제 #4
0
    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;
        }
    }