예제 #1
0
        private bool IsAvailable(IInvocationExpression expression, out MemberWithAccess preconditionContainer,
                                 out MemberWithAccess lessVisibleMember)
        {
            preconditionContainer = null;
            lessVisibleMember     = null;

            var contractAssertion = CodeContractAssertion.FromInvocationExpression(expression);

            if (contractAssertion == null || contractAssertion.AssertionType != ContractAssertionType.Requires)
            {
                return(false);
            }

            var preconditionHolder =
                expression.GetContainingStatement()
                .With(x => x.GetContainingTypeMemberDeclaration())
                .With(x => x.DeclaredElement)
                .With(MemberWithAccess.FromDeclaredElement);

            preconditionContainer = preconditionHolder;
            if (preconditionContainer == null)
            {
                return(false);
            }

            // Looking for a "enclosing" members that are less visible then a contract holder.
            // The only exception is a field with ContractPublicPropertyName attribute.
            lessVisibleMember =
                ProcessReferenceExpressions(contractAssertion.OriginalPredicateExpression)
                .FirstOrDefault(member =>
                                !FieldFromPreconditionMarkedWithContractPublicPropertyName(member) &&
                                !AccessVisibilityChecker.Member(member).IsAccessibleFrom(preconditionHolder));

            return(lessVisibleMember != null);
        }
        public static AccessRights GetCombinedAccessRights(this MemberWithAccess member)
        {
            Contract.Requires(member != null);

            return(AccessVisibilityChecker.CombineTypeAndMemberAccessRights(member.TypeAccessRights,
                                                                            member.MemberAccessRights));
        }
        private bool ExceptionIsLessVisible(MemberWithAccess preconditionContainer, IClass exception)
        {
            Contract.Requires(preconditionContainer != null);
            Contract.Requires(exception != null);

            return(!AccessVisibilityChecker.MemberWith(exception.GetAccessRights())
                   .IsAccessibleFrom(preconditionContainer.GetCombinedAccessRights()));
        }