private void ApplyParameters(OpenApiOperation operation, MethodInfo methodInfo) { if (methodInfo != null) { var methodMemberName = XmlCommentsNodeNameHelper.GetMemberNameForMethod(methodInfo); foreach (var parameter in methodInfo.GetParameters()) { if (!String.IsNullOrEmpty(parameter.Name)) { var paramNode = _xmlNavigator.SelectSingleNode( $"/doc/members/member[@name='{methodMemberName}']/param[@name='{parameter.Name}']"); if (paramNode != null) { var humanizedDescription = XmlCommentsTextHelper.Humanize(paramNode.InnerXml); var operationParameter = operation.Parameters .FirstOrDefault(x => x.Name == parameter.Name); if (operationParameter != null) { operationParameter.Description = humanizedDescription; } } } } } }
private bool TryApplyMethodTags(OpenApiOperation operation, MethodInfo methodInfo) { var methodMemberName = XmlCommentsNodeNameHelper.GetMemberNameForMethod(methodInfo); var methodNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{methodMemberName}']"); if (methodNode == null) { return(false); } var summaryNode = methodNode.SelectSingleNode("summary"); if (summaryNode != null) { operation.Summary = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml); } var remarksNode = methodNode.SelectSingleNode("remarks"); if (remarksNode != null) { operation.Description = XmlCommentsTextHelper.Humanize(remarksNode.InnerXml); } var responseNodes = methodNode.Select("response"); ApplyResponseTags(operation, responseNodes); return(true); }
private void ApplyParamTags(OpenApiParameter parameter, ParameterInfo parameterInfo) { if (!(parameterInfo.Member is MethodInfo methodInfo)) { return; } // If method is from a constructed generic type, look for comments from the generic type method var targetMethod = methodInfo.DeclaringType.IsConstructedGenericType ? methodInfo.GetUnderlyingGenericTypeMethod() : methodInfo; if (targetMethod == null) { return; } var methodMemberName = XmlCommentsNodeNameHelper.GetMemberNameForMethod(targetMethod); var paramNode = _xmlNavigator.SelectSingleNode( $"/doc/members/member[@name='{methodMemberName}']/param[@name='{parameterInfo.Name}']"); if (paramNode != null) { parameter.Description = XmlCommentsTextHelper.Humanize(paramNode.InnerXml); var example = paramNode.GetAttribute("example", ""); if (!string.IsNullOrEmpty(example)) { parameter.Example = JsonMapper.CreateFromJson(example); } } }
public void GetMemberNameForMethod_ReturnsCorrectXmlCommentsMemberName_ForGivenMethodInfo( Type declaringType, string name, string expectedMemberName) { var methodInfo = declaringType.GetMethod(name); var memberName = XmlCommentsNodeNameHelper.GetMemberNameForMethod(methodInfo); _output.WriteLine(expectedMemberName); _output.WriteLine(memberName); Assert.Equal(expectedMemberName, memberName); }
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)); } } }