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())); }