/// <summary> /// Replaces any MemberBindings of the form (this,x) in the methodContract with a method call where the method /// being called is P where x is a private field of the source type that has been marked as [ContractPublicPropertyName("P")]. /// </summary> /// <param name="targetType"></param> /// <param name="sourceType"></param> /// <param name="methodContract"></param> internal static void ReplacePrivateFieldsThatHavePublicProperties(TypeNode targetType, TypeNode sourceType, MethodContract methodContract, ContractNodes contractNodes ) { Contract.Requires(sourceType != null); Dictionary<Field, Method> field2Getter = new Dictionary<Field, Method>(); for (int i = 0, n = /*sourceType.Members == null ? 0 : */ sourceType.Members.Count; i < n; i++) { Field f = sourceType.Members[i] as Field; if (f == null) continue; string propertyName = HelperMethods.GetStringFromAttribute(f, ContractNodes.SpecPublicAttributeName); if (propertyName != null) { Property p = sourceType.GetProperty(Identifier.For(propertyName)); if (p != null) { field2Getter.Add(f, p.Getter); } } } if (0 < field2Getter.Count) { SubstitutePropertyGetterForField s = new SubstitutePropertyGetterForField(field2Getter); s.Visit(methodContract); } return; }