public override void TraverseChildren(IBoundExpression boundExpression) { var tm = boundExpression.Definition as ITypeMemberReference; if (tm != null) { var resolvedMember = tm.ResolvedTypeDefinitionMember; string propertyName = ContractHelper.GetStringArgumentFromAttribute(resolvedMember.Attributes, "System.Diagnostics.Contracts.ContractPublicPropertyNameAttribute"); // we don't care what it is, it just means it has a public property that represents it // so if it is null, then it is *not* a field that has a [ContractPublicPropertyName] marking // and so its visibility counts. If it *is* such a field, then it is considered to be public. // (TODO: checker should make sure that the property it names is public.) if (propertyName == null) { this.currentVisibility = TypeHelper.VisibilityIntersection(this.currentVisibility, resolvedMember.Visibility); } } base.TraverseChildren(boundExpression); }