handle metadata names

This commit is contained in:
Matt Parker
2025-10-11 15:02:31 +10:00
parent 5bebad38cc
commit 26585f015b

View File

@@ -258,6 +258,40 @@ public static class SymbolInfoComponents
} }
} }
} }
// TODO: parse these types better?
private static (string, Color) GetForMetadataName(string metadataName)
{
var typeChar = metadataName[0];
var typeColour = typeChar switch
{
'N' => CachedColors.KeywordBlue,
'T' => CachedColors.ClassGreen,
'F' => CachedColors.White,
'P' => CachedColors.White,
'M' => CachedColors.Yellow,
'E' => CachedColors.White,
_ => CachedColors.Orange
};
var minimalTypeName = (typeChar, metadataName) switch
{
// T:Microsoft.Extensions.DependencyInjection.IServiceCollection
// M:Microsoft.Extensions.DependencyInjection.OptionsBuilderExtensions.ValidateOnStart``1(Microsoft.Extensions.Options.OptionsBuilder{``0})
// F:Namespace.TypeName.FieldName
// P:Namespace.TypeName.PropertyName
// E:Namespace.TypeName.EventName
// N:Namespace.Name
('N', _) => metadataName.Split('.').Last(),
('T', _) => metadataName.Split('.').Last(),
('F', _) => metadataName.Split('.').Last(),
('P', _) => metadataName.Split('.').Last(),
('E', _) => metadataName.Split('.').Last(),
('M', var s) when s.Contains('(') => s[(s.Split('(')[0].LastIndexOf('.') + 1)..s.IndexOf('(')],
('M', var s) => s.Split('.').Last(),
_ => metadataName
};
return (minimalTypeName, typeColour);
}
private static void AddXmlDocFragment(this RichTextLabel label, string xmlFragment) private static void AddXmlDocFragment(this RichTextLabel label, string xmlFragment)
{ {
@@ -268,25 +302,14 @@ public static class SymbolInfoComponents
{ {
label.AddText(reader.Value); label.AddText(reader.Value);
} }
else if (reader is { NodeType: System.Xml.XmlNodeType.Element, Name: DocumentationCommentXmlNames.SeeElementName }) else if (reader is { NodeType: System.Xml.XmlNodeType.Element, Name: DocumentationCommentXmlNames.SeeElementName or DocumentationCommentXmlNames.SeeAlsoElementName })
{ {
var cref = reader.GetAttribute(DocumentationCommentXmlNames.CrefAttributeName); var cref = reader.GetAttribute(DocumentationCommentXmlNames.CrefAttributeName);
if (cref is not null) if (cref is not null)
{ {
var minimalTypeName = cref.Split('.').Last(); // may be suboptimal for anything other than T var (minimalTypeName, typeColour) = GetForMetadataName(cref);
var typeColour = cref[0] switch
{
'N' => CachedColors.KeywordBlue,
'T' => CachedColors.ClassGreen,
'F' => CachedColors.White,
'P' => CachedColors.White,
'M' => CachedColors.Yellow,
'E' => CachedColors.White,
_ => CachedColors.Orange
};
label.PushMeta("TODO", RichTextLabel.MetaUnderline.OnHover); label.PushMeta("TODO", RichTextLabel.MetaUnderline.OnHover);
label.PushColor(typeColour); label.PushColor(typeColour);
//label.AddText(cref.TrimStart('!', ':')); // remove !: prefix
label.AddText(minimalTypeName); label.AddText(minimalTypeName);
label.Pop(); label.Pop();
label.Pop(); // meta label.Pop(); // meta
@@ -337,7 +360,6 @@ public static class SymbolInfoComponents
if (docComment.SummaryText is not null) if (docComment.SummaryText is not null)
{ {
label.AddXmlDocFragment(docComment.SummaryText); label.AddXmlDocFragment(docComment.SummaryText);
//label.AddText(docComment.SummaryText);
label.Newline(); label.Newline();
} }
label.PushTable(2); label.PushTable(2);
@@ -357,7 +379,7 @@ public static class SymbolInfoComponents
label.AddText(parameterName); label.AddText(parameterName);
label.Pop(); label.Pop();
label.AddText(" - "); label.AddText(" - ");
label.AddText(parameterText); label.AddXmlDocFragment(parameterText);
label.Pop(); // cell label.Pop(); // cell
if (index < docComment.ParameterNames.Length - 1) if (index < docComment.ParameterNames.Length - 1)
{ {
@@ -383,7 +405,7 @@ public static class SymbolInfoComponents
label.AddText(typeParameterName); label.AddText(typeParameterName);
label.Pop(); label.Pop();
label.AddText(" - "); label.AddText(" - ");
label.AddText(typeParameterText); label.AddXmlDocFragment(typeParameterText);
label.Pop(); // cell label.Pop(); // cell
if (index < docComment.TypeParameterNames.Length - 1) if (index < docComment.TypeParameterNames.Length - 1)
{ {
@@ -400,7 +422,7 @@ public static class SymbolInfoComponents
label.Pop(); label.Pop();
label.Pop(); label.Pop();
label.PushCell(); label.PushCell();
label.AddText(docComment.ReturnsText); label.AddXmlDocFragment(docComment.ReturnsText);
label.Pop(); // cell label.Pop(); // cell
} }
@@ -416,11 +438,11 @@ public static class SymbolInfoComponents
var exceptionText = docComment.GetExceptionTexts(exceptionTypeName).FirstOrDefault(); var exceptionText = docComment.GetExceptionTexts(exceptionTypeName).FirstOrDefault();
if (exceptionText is null) continue; if (exceptionText is null) continue;
label.PushCell(); label.PushCell();
label.PushColor(CachedColors.InterfaceGreen); label.PushColor(CachedColors.ClassGreen);
label.AddText(exceptionTypeName); label.AddText(exceptionTypeName.Split('.').Last());
label.Pop(); label.Pop();
label.AddText(" - "); label.AddText(" - ");
label.AddText(exceptionText); label.AddXmlDocFragment(exceptionText);
label.Pop(); // cell label.Pop(); // cell
if (index < docComment.ExceptionTypes.Length - 1) if (index < docComment.ExceptionTypes.Length - 1)
{ {
@@ -438,7 +460,7 @@ public static class SymbolInfoComponents
label.Pop(); label.Pop();
label.Pop(); label.Pop();
label.PushCell(); label.PushCell();
label.AddText(docComment.RemarksText); label.AddXmlDocFragment(docComment.RemarksText);
label.Pop(); // cell label.Pop(); // cell
label.PushCell(); label.PushCell();
label.Pop(); label.Pop();