private static MemberInfo GetTarget(MemberInfo memberInfo, string cref) { var type = memberInfo.DeclaringType ?? memberInfo.ReflectedType; if (type == null) { return(null); } // Find all matching members in all interfaces and the base class. var targets = type.GetInterfaces() .Append(type.BaseType) .SelectMany( x => x.FindMembers( memberInfo.MemberType, BindingFlags.Instance | BindingFlags.Public, (info, criteria) => info.Name == memberInfo.Name, null)) .ToList(); // Try to find the target, if one is declared. if (!string.IsNullOrEmpty(cref)) { var crefTarget = targets.SingleOrDefault(t => XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(t) == cref); if (crefTarget != null) { return(crefTarget); } } // We use the last since that will be our base class or the "nearest" implemented interface. return(targets.LastOrDefault()); }
private string GetFieldDescription(string idName, OperationFilterContext context) { var name = char.ToUpperInvariant(idName[0]) + idName.Substring(1); var classProp = context.MethodInfo.GetParameters().FirstOrDefault()?.ParameterType?.GetProperties().FirstOrDefault(x => x.Name == name); var typeAttr = classProp != null ? (DescriptionAttribute)classProp.GetCustomAttribute <DescriptionAttribute>() : null; if (typeAttr != null) { return(typeAttr?.Description); } if (classProp != null) { foreach (var xmlNavigator in xmlNavigators) { var propertyMemberName = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(classProp); var propertySummaryNode = xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{propertyMemberName}']/summary"); if (propertySummaryNode != null) { return(XmlCommentsTextHelper.Humanize(propertySummaryNode.InnerXml)); } } } return(null); }
public string GetPropertyExample(PropertyInfo propertyInfo) { var propertyMemberName = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(propertyInfo); var propertyExampleNode = this.xpathNavigator.SelectSingleNode($"/doc/members/member[@name='{propertyMemberName}']/example"); if (propertyExampleNode == null) { return(string.Empty); } var example = XmlCommentsTextHelper.Humanize(propertyExampleNode.InnerXml); return(example); }
public void GetMemberNameForProperty_ReturnsCorrectXmlCommentMemberName_ForGivenMemberInfo( Type declaringType, string fieldOrPropertyName, string expectedMemberName ) { var memberInfo = declaringType.GetMember(fieldOrPropertyName)[0]; var memberName = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(memberInfo); _output.WriteLine(expectedMemberName); _output.WriteLine(memberName); Assert.Equal(expectedMemberName, memberName); }
private void ApplyPropertyComments(OpenApiSchema propertySchema, MemberInfo memberInfo) { var memberName = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(memberInfo); if (!_inheritedDocs.ContainsKey(memberName)) { return; } if (_excludedTypes.Any() && _excludedTypes.ToList() .Contains(((PropertyInfo)memberInfo).PropertyType)) { return; } var cref = _inheritedDocs[memberName]; var target = GetTargetRecursive(memberInfo, cref); var targetXmlNode = GetMemberXmlNode(XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(target)); if (targetXmlNode == null) { return; } var summaryNode = targetXmlNode.SelectSingleNode(SummaryTag); if (summaryNode != null) { propertySchema.Description = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml); if (_includeRemarks) { var remarksNode = targetXmlNode.SelectSingleNode(RemarksTag); if (remarksNode != null && !string.IsNullOrWhiteSpace(remarksNode.InnerXml)) { propertySchema.Description += $" ({XmlCommentsTextHelper.Humanize(remarksNode.InnerXml)})"; } } } var exampleNode = targetXmlNode.SelectSingleNode(ExampleTag); if (exampleNode != null) { propertySchema.Example = new OpenApiString(XmlCommentsTextHelper.Humanize(exampleNode.InnerXml)); } }
private MemberInfo GetTargetRecursive(MemberInfo memberInfo, string cref) { var target = GetTarget(memberInfo, cref); if (target == null) { return(null); } var targetMemberName = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(target); if (_inheritedDocs.ContainsKey(targetMemberName)) { return(GetTarget(target, _inheritedDocs[targetMemberName])); } return(target); }
private static void Populate_MethodParams(XPathNavigator rawRoot, XPathNavigator newPathMembers, MergeArgType type) { /* * <member name="M:DataContract.IService2Async.Call3Async(DataContract.CallObj,System.String)"> * <summary> * Call3Async des * </summary> * <param name="obj">obj des</param> * <param name="s1">s1 des</param> * <returns></returns> * </member> * * -> * * <member name="T:DataContract.CallObjXXX.obj"> //ref obj will ignore the summary * <summary> * obj des * </summary> * </member> * <member name="T:DataContract.CallObjXXX.s1"> * <summary> * s1 des * </summary> * </member> */ var methodStr = XmlCommentsNodeNameHelper.GetMemberNameForMethod(type.MethodInfo); foreach (var p in type.MethodInfo.GetParameters()) { var pPath = rawRoot.SelectSingleNode($"/doc/members/member[@name='{methodStr}']/param[@name='{p.Name}']"); var prop = type.TypeWithoutPathQueryStream !.GetProperties().FirstOrDefault(i => i.Name == p.Name); if (pPath != null && prop != null) { var str = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(prop); newPathMembers.AppendChild(GetXml(str, pPath.Value)); } } }
private void ApplyPropertyTags(OpenApiRequestBody requestBody, PropertyInfo propertyInfo) { if (propertyInfo.DeclaringType != null && _excludedTypes.Any() && _excludedTypes.ToList().Contains(propertyInfo.DeclaringType)) { return; } var propertyMemberName = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(propertyInfo); var propertySummaryNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{propertyMemberName}']/{SummaryTag}"); if (propertySummaryNode != null) { var propertyRemarksNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{propertyMemberName}']/{RemarksTag}"); if (propertyRemarksNode != null && !string.IsNullOrWhiteSpace(propertyRemarksNode.InnerXml) && !requestBody.Description.Contains(XmlCommentsTextHelper.Humanize(propertyRemarksNode.InnerXml))) { requestBody.Description += $" ({XmlCommentsTextHelper.Humanize(propertyRemarksNode.InnerXml)})"; } } }
private void ApplyFieldOrPropertyTags(OpenApiSchema schema, MemberInfo fieldOrPropertyInfo) { if (fieldOrPropertyInfo.DeclaringType != null && _excludedTypes.Any() && _excludedTypes.ToList().Contains(fieldOrPropertyInfo.DeclaringType)) { return; } var fieldOrPropertyMemberName = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(fieldOrPropertyInfo); var fieldOrPropertyNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{fieldOrPropertyMemberName}']"); var summaryNode = fieldOrPropertyNode?.SelectSingleNode(SummaryTag); if (summaryNode != null) { var remarksNode = fieldOrPropertyNode.SelectSingleNode(RemarksTag); if (remarksNode != null && !string.IsNullOrWhiteSpace(remarksNode.InnerXml) && !schema.Description.Contains(XmlCommentsTextHelper.Humanize(remarksNode.InnerXml))) { schema.Description += $" ({XmlCommentsTextHelper.Humanize(remarksNode.InnerXml)})"; } } }
private void ApplyFieldOrPropertyTags(OpenApiSchema schema, MemberInfo fieldOrPropertyInfo) { var fieldOrPropertyMemberName = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(fieldOrPropertyInfo); var fieldOrPropertyNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{fieldOrPropertyMemberName}']"); if (fieldOrPropertyNode == null) { return; } var summaryNode = fieldOrPropertyNode.SelectSingleNode("summary"); if (summaryNode != null) { schema.Description = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml); } var exampleNode = fieldOrPropertyNode.SelectSingleNode("example"); if (exampleNode != null) { schema.Example = JsonMapper.CreateFromJson(exampleNode.InnerXml); } }