private static INamedTypeSymbol FindOriginatingSymbol(ISymbol accessedMember, IAssemblySymbol usageSite)
        {
            if (accessedMember == null)
            {
                return(null);
            }

            var originatingInterface = accessedMember.GetInterfaceMember()?.ContainingType;

            if (originatingInterface != null &&
                IsNotInternalOrSameAssembly(originatingInterface))
            {
                return(originatingInterface);
            }

            var originatingType = SymbolHelper.GetOverriddenMember(accessedMember)?.ContainingType;

            if (originatingType != null &&
                IsNotInternalOrSameAssembly(originatingType))
            {
                return(originatingType);
            }

            return(accessedMember.ContainingType);

            // Do not suggest internal types that are declared in an assembly different than
            // the one that's declaring the parameter. Such types should not be suggested at
            // all if there is no InternalsVisibleTo attribute present in the compilation.
            // Since the check for the attribute must be done in CompilationEnd thus making
            // the rule unusable in Visual Studio, we will not suggest such classes and will
            // generate some False Negatives.
            bool IsNotInternalOrSameAssembly(INamedTypeSymbol namedTypeSymbol) =>
            namedTypeSymbol.ContainingAssembly.Equals(usageSite) ||
            namedTypeSymbol.GetEffectiveAccessibility() != Accessibility.Internal;
        }
Esempio n. 2
0
        private INamedTypeSymbol FindOriginatingSymbol(ISymbol accessedMember)
        {
            if (accessedMember == null)
            {
                return(null);
            }

            var originatingInterface = accessedMember.GetInterfaceMember()?.ContainingType;

            if (originatingInterface != null)
            {
                return(originatingInterface);
            }

            var overridenSymbol = SymbolHelper.GetOverriddenMember(accessedMember);

            return(overridenSymbol != null
                ? overridenSymbol.ContainingType
                : accessedMember.ContainingType);
        }