public bool IsPure(IMethodSymbol symbol)
        {
            Contract.Requires(symbol != null);

            // If method has out or ref param the return value could be ignored!

            if (symbol.ReturnsVoid || symbol.Parameters.Any(p => p.RefKind == RefKind.Out || p.RefKind == RefKind.Ref))
            {
                return false;
            }

            ImmutableArray<IMethodSymbol> methodChain = symbol.MethodAndFullInheritanceChain();

            if (HasPureAttribute(methodChain))
            {
                return true;
            }

            if (IsStaticOnStruct(symbol))
            {
                return true;
            }

            if (IsImmutableMemberCall(symbol, methodChain))
            {
                return true;
            }

            if (IsFactoryMethod(symbol))
            {
                return true;
            }

            if (WithPattern(symbol) && ReturnsTheSameType(symbol))
            {
                return true;
            }

            return false;
        }
Example #2
0
        public bool IsPure(IMethodSymbol symbol)
        {
            Contract.Requires(symbol != null);

            // If method has out or ref param the return value could be ignored!

            if (symbol.ReturnsVoid || symbol.Parameters.Any(p => p.RefKind == RefKind.Out || p.RefKind == RefKind.Ref))
            {
                return(false);
            }

            ImmutableArray <IMethodSymbol> methodChain = symbol.MethodAndFullInheritanceChain();

            if (HasPureAttribute(methodChain))
            {
                return(true);
            }

            if (IsStaticOnStruct(symbol))
            {
                return(true);
            }

            if (IsImmutableMemberCall(symbol, methodChain))
            {
                return(true);
            }

            if (IsFactoryMethod(symbol))
            {
                return(true);
            }

            if (WithPattern(symbol) && ReturnsTheSameType(symbol))
            {
                return(true);
            }

            return(false);
        }