public void PackageMethodContracts(IMethodDefinition method, bool isPure) { Contract.Requires(method != null); #region Package purity if (isPure) { PackageContract(new XPure(this.host, isPure, docTracker)); } //Don't package anything if it isn't pure. (That way it is easyer to deal with on the Sandcastle side) #endregion #region Package contracts from this implementation IMethodContract thisContract; if (CCDocContractHelper.TryGetMethodContract(host, method, out thisContract, docTracker)) { PackageMethodContracts(thisContract, null, null); } #endregion #region Package contracts from base overrides if (!method.IsNewSlot) // REVIEW: Is there a better test? { IMethodDefinition overriddenMethod = MemberHelper.GetImplicitlyOverriddenBaseClassMethod(method) as IMethodDefinition; while (overriddenMethod != null && overriddenMethod != Dummy.Method) { IMethodContract /*?*/ overriddenContract; if (CCDocContractHelper.TryGetMethodContract(host, overriddenMethod, out overriddenContract, docTracker)) { SubstituteParameters sps = new SubstituteParameters(this.host, method, overriddenMethod); IMethodContract newContract = sps.Rewrite(overriddenContract) as MethodContract; var unspecializedMethod = MethodHelper.Unspecialize(overriddenMethod); var methodId = MemberHelper.GetMemberSignature(unspecializedMethod, NameFormattingOptions.DocumentationId); var typeName = TypeHelper.GetTypeName(unspecializedMethod.ContainingType, NameFormattingOptions.OmitContainingNamespace | NameFormattingOptions.OmitContainingType); PackageMethodContracts(newContract, methodId, typeName); } overriddenMethod = MemberHelper.GetImplicitlyOverriddenBaseClassMethod(overriddenMethod) as IMethodDefinition; } } #endregion #region Package contracts from implicit interface implementations foreach (IMethodDefinition ifaceMethod in MemberHelper.GetImplicitlyImplementedInterfaceMethods(method)) { IMethodContract /*?*/ ifaceContract; if (!CCDocContractHelper.TryGetMethodContract(host, ifaceMethod, out ifaceContract, docTracker)) { continue; } SubstituteParameters sps = new SubstituteParameters(this.host, method, ifaceMethod); IMethodContract newContract = sps.Rewrite(ifaceContract) as MethodContract; var unspecializedMethod = MethodHelper.Unspecialize(ifaceMethod); var methodId = MemberHelper.GetMemberSignature(unspecializedMethod, NameFormattingOptions.DocumentationId); var typeName = TypeHelper.GetTypeName(unspecializedMethod.ContainingType, NameFormattingOptions.OmitContainingNamespace | NameFormattingOptions.OmitContainingType); PackageMethodContracts(newContract, methodId, typeName); } #endregion #region Package contracts from explicit interface implementations // REVIEW: Why does GetExplicitlyOverriddenMethods return IMethodReference when GetImplicitlyImplementedInterfaceMethods // returns IMethodDefinition? foreach (IMethodReference ifaceMethodRef in MemberHelper.GetExplicitlyOverriddenMethods(method)) { IMethodDefinition /*?*/ ifaceMethod = ifaceMethodRef.ResolvedMethod; if (ifaceMethod == null) { continue; } IMethodContract /*?*/ ifaceContract; if (!CCDocContractHelper.TryGetMethodContract(host, ifaceMethod, out ifaceContract, docTracker)) { continue; } SubstituteParameters sps = new SubstituteParameters(this.host, method, ifaceMethod); IMethodContract newContract = sps.Rewrite(ifaceContract) as MethodContract; var unspecializedMethod = MethodHelper.Unspecialize(ifaceMethod); var methodId = MemberHelper.GetMemberSignature(unspecializedMethod, NameFormattingOptions.DocumentationId); var typeName = TypeHelper.GetTypeName(unspecializedMethod.ContainingType, NameFormattingOptions.OmitContainingNamespace | NameFormattingOptions.OmitContainingType); PackageMethodContracts(newContract, methodId, typeName);; } #endregion }