Exemplo n.º 1
0
        public virtual SymbolFilterReason GetReason(IMethodSymbol symbol)
        {
            bool canBeImplicitlyDeclared = false;

            if (!Includes(SymbolGroupFilter.Method))
            {
                return(SymbolFilterReason.SymbolGroup);
            }

            switch (symbol.MethodKind)
            {
            case MethodKind.Constructor:
            {
                TypeKind typeKind = symbol.ContainingType.TypeKind;

                Debug.Assert(typeKind.Is(TypeKind.Class, TypeKind.Struct, TypeKind.Enum), symbol.ToDisplayString(SymbolDisplayFormats.Test));

                if (typeKind == TypeKind.Class &&
                    !symbol.Parameters.Any())
                {
                    canBeImplicitlyDeclared = true;
                }

                break;
            }

            case MethodKind.Conversion:
            case MethodKind.UserDefinedOperator:
            case MethodKind.Ordinary:
            case MethodKind.StaticConstructor:
            case MethodKind.Destructor:
            case MethodKind.ExplicitInterfaceImplementation:
            {
                break;
            }

            default:
            {
                return(SymbolFilterReason.Other);
            }
            }

            if (!canBeImplicitlyDeclared && symbol.IsImplicitlyDeclared)
            {
                return(SymbolFilterReason.ImplicitlyDeclared);
            }

            if (!symbol.IsVisible(Visibility))
            {
                return(SymbolFilterReason.Visibility);
            }

            return(GetRulesReason(symbol));
        }
Exemplo n.º 2
0
 public IEnumerable <IEventSymbol> GetEvents(bool includeInherited = false)
 {
     if (!TypeKind.Is(TypeKind.Delegate, TypeKind.Enum))
     {
         foreach (ISymbol member in (GetMembers(includeInherited)))
         {
             if (member.Kind == SymbolKind.Event)
             {
                 yield return((IEventSymbol)member);
             }
         }
     }
 }
Exemplo n.º 3
0
 public IEnumerable <INamedTypeSymbol> GetAllDerivedTypes()
 {
     if (TypeKind.Is(TypeKind.Class, TypeKind.Interface) &&
         !IsStatic)
     {
         foreach (INamedTypeSymbol typeSymbol in DocumentationModel.Types)
         {
             if (typeSymbol.InheritsFrom(Symbol, includeInterfaces: true))
             {
                 yield return(typeSymbol);
             }
         }
     }
 }
Exemplo n.º 4
0
        public IEnumerable <INamedTypeSymbol> GetDelegates(bool includeInherited = false)
        {
            if (!TypeKind.Is(TypeKind.Interface, TypeKind.Delegate, TypeKind.Enum))
            {
                foreach (ISymbol member in (GetMembers(includeInherited)))
                {
                    if (member.Kind == SymbolKind.NamedType)
                    {
                        var namedType = (INamedTypeSymbol)member;

                        if (namedType.TypeKind == TypeKind.Delegate)
                        {
                            yield return(namedType);
                        }
                    }
                }
            }
        }
Exemplo n.º 5
0
        public IEnumerable <IMethodSymbol> GetMethods(bool includeInherited = false)
        {
            if (!TypeKind.Is(TypeKind.Delegate, TypeKind.Enum))
            {
                foreach (ISymbol member in (GetMembers(includeInherited)))
                {
                    if (member.Kind == SymbolKind.Method)
                    {
                        var methodSymbol = (IMethodSymbol)member;

                        if (methodSymbol.MethodKind == MethodKind.Ordinary)
                        {
                            yield return(methodSymbol);
                        }
                    }
                }
            }
        }
Exemplo n.º 6
0
        public IEnumerable <IPropertySymbol> GetProperties(bool includeInherited = false, bool includeIndexers = false)
        {
            if (!TypeKind.Is(TypeKind.Delegate, TypeKind.Enum))
            {
                foreach (ISymbol member in (GetMembers(includeInherited)))
                {
                    if (member.Kind == SymbolKind.Property)
                    {
                        var propertySymbol = (IPropertySymbol)member;

                        if (includeIndexers || !propertySymbol.IsIndexer)
                        {
                            yield return(propertySymbol);
                        }
                    }
                }
            }
        }
Exemplo n.º 7
0
        public IEnumerable <IMethodSymbol> GetOperators(
            bool includeInherited           = false,
            bool includeConversion          = true,
            bool includeUserDefinedOperator = true)
        {
            if (!TypeKind.Is(TypeKind.Delegate, TypeKind.Enum))
            {
                foreach (ISymbol member in (GetMembers(includeInherited)))
                {
                    if (member.Kind == SymbolKind.Method)
                    {
                        var methodSymbol = (IMethodSymbol)member;

                        switch (methodSymbol.MethodKind)
                        {
                        case MethodKind.UserDefinedOperator:
                        {
                            if (includeUserDefinedOperator)
                            {
                                yield return(methodSymbol);
                            }

                            break;
                        }

                        case MethodKind.Conversion:
                        {
                            if (includeConversion)
                            {
                                yield return(methodSymbol);
                            }

                            break;
                        }
                        }
                    }
                }
            }
        }
Exemplo n.º 8
0
        public IEnumerable <IMethodSymbol> GetConstructors()
        {
            if (!TypeKind.Is(TypeKind.Delegate, TypeKind.Enum))
            {
                foreach (ISymbol member in Members)
                {
                    if (member.Kind == SymbolKind.Method)
                    {
                        var methodSymbol = (IMethodSymbol)member;

                        if (methodSymbol.MethodKind == MethodKind.Constructor)
                        {
                            if (methodSymbol.ContainingType.TypeKind != TypeKind.Struct ||
                                methodSymbol.Parameters.Any())
                            {
                                yield return(methodSymbol);
                            }
                        }
                    }
                }
            }
        }
Exemplo n.º 9
0
        public IEnumerable <INamedTypeSymbol> GetDerivedTypes()
        {
            if (TypeKind.Is(TypeKind.Class, TypeKind.Interface) &&
                !IsStatic)
            {
                foreach (INamedTypeSymbol typeSymbol in DocumentationModel.Types)
                {
                    if (typeSymbol.BaseType?.OriginalDefinition.Equals(Symbol) == true)
                    {
                        yield return(typeSymbol);
                    }

                    foreach (INamedTypeSymbol interfaceSymbol in typeSymbol.Interfaces)
                    {
                        if (interfaceSymbol.OriginalDefinition.Equals(Symbol))
                        {
                            yield return(typeSymbol);
                        }
                    }
                }
            }
        }
Exemplo n.º 10
0
        internal IEnumerable <ISymbol> GetMembers(TypeDocumentationParts ignoredParts = TypeDocumentationParts.None)
        {
            if (!TypeKind.Is(TypeKind.Enum, TypeKind.Delegate))
            {
                if (IsEnabled(TypeDocumentationParts.Constructors))
                {
                    foreach (IMethodSymbol result in GetConstructors())
                    {
                        yield return(result);
                    }
                }

                if (IsEnabled(TypeDocumentationParts.Fields))
                {
                    foreach (IFieldSymbol result in GetFields())
                    {
                        yield return(result);
                    }
                }

                if (IsEnabled(TypeDocumentationParts.Indexers))
                {
                    foreach (IPropertySymbol result in GetIndexers())
                    {
                        yield return(result);
                    }
                }

                if (IsEnabled(TypeDocumentationParts.Properties))
                {
                    foreach (IPropertySymbol result in GetProperties())
                    {
                        yield return(result);
                    }
                }

                if (IsEnabled(TypeDocumentationParts.Methods))
                {
                    foreach (IMethodSymbol result in GetMethods())
                    {
                        yield return(result);
                    }
                }

                if (IsEnabled(TypeDocumentationParts.Operators))
                {
                    foreach (IMethodSymbol result in GetOperators())
                    {
                        yield return(result);
                    }
                }

                if (IsEnabled(TypeDocumentationParts.Events))
                {
                    foreach (IEventSymbol result in GetEvents())
                    {
                        yield return(result);
                    }
                }

                if (IsEnabled(TypeDocumentationParts.ExplicitInterfaceImplementations))
                {
                    foreach (ISymbol result in GetExplicitInterfaceImplementations())
                    {
                        yield return(result);
                    }
                }

                bool IsEnabled(TypeDocumentationParts part)
                {
                    return((ignoredParts & part) == 0);
                }
            }
        }
Exemplo n.º 11
0
        public IEnumerable <ISymbol> GetExplicitInterfaceImplementations()
        {
            if (TypeKind.Is(TypeKind.Delegate, TypeKind.Enum))
            {
                yield break;
            }

            foreach (ISymbol member in Symbol.GetMembers())
            {
                switch (member.Kind)
                {
                case SymbolKind.Event:
                {
                    var eventSymbol = (IEventSymbol)member;

                    if (!eventSymbol.ExplicitInterfaceImplementations.IsDefaultOrEmpty)
                    {
                        yield return(eventSymbol);
                    }

                    break;
                }

                case SymbolKind.Method:
                {
                    var methodSymbol = (IMethodSymbol)member;

                    if (methodSymbol.MethodKind != MethodKind.ExplicitInterfaceImplementation)
                    {
                        break;
                    }

                    ImmutableArray <IMethodSymbol> explicitInterfaceImplementations = methodSymbol.ExplicitInterfaceImplementations;

                    if (explicitInterfaceImplementations.IsDefaultOrEmpty)
                    {
                        break;
                    }

                    if (methodSymbol.MetadataName.EndsWith(".get_Item", StringComparison.Ordinal))
                    {
                        if (explicitInterfaceImplementations[0].MethodKind == MethodKind.PropertyGet)
                        {
                            break;
                        }
                    }
                    else if (methodSymbol.MetadataName.EndsWith(".set_Item", StringComparison.Ordinal))
                    {
                        if (explicitInterfaceImplementations[0].MethodKind == MethodKind.PropertySet)
                        {
                            break;
                        }
                    }

                    yield return(methodSymbol);

                    break;
                }

                case SymbolKind.Property:
                {
                    var propertySymbol = (IPropertySymbol)member;

                    if (!propertySymbol.ExplicitInterfaceImplementations.IsDefaultOrEmpty)
                    {
                        yield return(propertySymbol);
                    }

                    break;
                }
                }
            }
        }