예제 #1
0
        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);
        }
예제 #3
0
        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);
        }
예제 #5
0
        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));
            }
        }
예제 #6
0
        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);
        }
예제 #7
0
        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));
                }
            }
        }
예제 #8
0
        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)})";
                }
            }
        }
예제 #9
0
        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);
            }
        }