diff --git a/examples/Demo/DocGenerator/CodeCommentsGenerator.cs b/examples/Demo/DocGenerator/CodeCommentsGenerator.cs index a9fdfd4950..d27e3e4f11 100644 --- a/examples/Demo/DocGenerator/CodeCommentsGenerator.cs +++ b/examples/Demo/DocGenerator/CodeCommentsGenerator.cs @@ -79,6 +79,8 @@ private static string CleanupParamName(string value) value = regex.Replace(value, ""); regex = new("[P,T,M,F]:FluentUI\\.Demo\\.Shared\\."); value = regex.Replace(value, ""); + regex = new("\\(.*\\)$"); + value = regex.Replace(value, ""); return value; } diff --git a/examples/Demo/Shared/Components/ApiDocumentation.razor.cs b/examples/Demo/Shared/Components/ApiDocumentation.razor.cs index fb8e372afc..6efe245e98 100644 --- a/examples/Demo/Shared/Components/ApiDocumentation.razor.cs +++ b/examples/Demo/Shared/Components/ApiDocumentation.razor.cs @@ -141,7 +141,7 @@ private IEnumerable GetMembers(MemberTypes type) Type = propertyInfo.ToTypeNameString(), EnumValues = GetEnumValues(propertyInfo), Default = defaultVaue, - Description = GetMembersDescription(Component, propertyInfo), + Description = GetDescription(Component, propertyInfo), IsParameter = isParameter, Icon = icon }); @@ -156,7 +156,7 @@ private IEnumerable GetMembers(MemberTypes type) MemberType = MemberTypes.Event, Name = propertyInfo.Name, Type = propertyInfo.ToTypeNameString(), - Description = GetMembersDescription(Component, propertyInfo) + Description = GetDescription(Component, propertyInfo) }); } } @@ -176,7 +176,7 @@ private IEnumerable GetMembers(MemberTypes type) Name = methodInfo.Name + genericArguments, Parameters = methodInfo.GetParameters().Select(i => $"{i.ToTypeNameString()} {i.Name}").ToArray(), Type = methodInfo.ToTypeNameString(), - Description = GetMembersDescription(Component, methodInfo) + Description = GetDescription(Component, methodInfo) }); } } @@ -195,19 +195,52 @@ private IEnumerable GetMembers(MemberTypes type) } /// - /// Gets member description. If none provided, base member description is returned. + /// Gets member description for generic MemberInfo. /// /// /// /// /// member description - private static string GetMembersDescription(Type component, T memberInfo) where T : MemberInfo + private static string GetDescription(Type component, T memberInfo) where T : MemberInfo { - var description = CodeComments.GetSummary(component.Name + "." + memberInfo.Name); + return DescriptionFromCodeComments(component, memberInfo.Name); + } + + /// + /// Gets description + /// + /// + /// + /// + /// + /// see the following about name mangling when dealing with generics + /// https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/xmldoc/#id-strings + /// + private static string GetDescription(Type component, MethodInfo methodInfo) + { + var genericArgumentCount = methodInfo.GetGenericArguments().Length; + var mangledName = methodInfo.Name + (genericArgumentCount == 0 ? "" : $"``{genericArgumentCount}"); + + var description = DescriptionFromCodeComments(component, mangledName); + + return description; + } + + /// + /// Gets member description from source generated class of component + /// descriptions. If none found, component base member description + /// is returned. + /// + /// + /// name of property, method, or event + /// + private static string DescriptionFromCodeComments(Type component, string name) + { + var description = CodeComments.GetSummary(component.Name + "." + name); if (description == null && component.BaseType != null) { - description = GetMembersDescription(component.BaseType, memberInfo); + description = DescriptionFromCodeComments(component.BaseType, name); } return description ?? string.Empty;