From 2e8fc663feb3523dde7c5e22b029fecc77fe0464 Mon Sep 17 00:00:00 2001 From: Matt Parker <61717342+MattParkerDev@users.noreply.github.com> Date: Sun, 12 Oct 2025 11:08:41 +1000 Subject: [PATCH] add property tooltip --- .../Features/CodeEditor/SharpIdeCodeEdit.cs | 2 +- .../CodeEditor/SymbolInfoComponents.cs | 4 +- .../CodeEditor/SymbolTooltips/FieldTooltip.cs | 2 +- .../SymbolTooltips/PropertyTooltip.cs | 107 ++++++++++++++++++ 4 files changed, 111 insertions(+), 4 deletions(-) create mode 100644 src/SharpIDE.Godot/Features/CodeEditor/SymbolTooltips/PropertyTooltip.cs diff --git a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs index 1e35956..78447e4 100644 --- a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs +++ b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs @@ -128,7 +128,7 @@ public partial class SharpIdeCodeEdit : CodeEdit { IMethodSymbol methodSymbol => SymbolInfoComponents.GetMethodSymbolInfo(methodSymbol), INamedTypeSymbol namedTypeSymbol => new Control(), - IPropertySymbol propertySymbol => new Control(), + IPropertySymbol propertySymbol => SymbolInfoComponents.GetPropertySymbolInfo(propertySymbol), IFieldSymbol fieldSymbol => SymbolInfoComponents.GetFieldSymbolInfo(fieldSymbol), IParameterSymbol parameterSymbol => new Control(), _ => new Control() diff --git a/src/SharpIDE.Godot/Features/CodeEditor/SymbolInfoComponents.cs b/src/SharpIDE.Godot/Features/CodeEditor/SymbolInfoComponents.cs index 6a074cc..16d2a96 100644 --- a/src/SharpIDE.Godot/Features/CodeEditor/SymbolInfoComponents.cs +++ b/src/SharpIDE.Godot/Features/CodeEditor/SymbolInfoComponents.cs @@ -20,7 +20,7 @@ public static partial class SymbolInfoComponents label.AddAttributes(methodSymbol); label.AddAccessibilityModifier(methodSymbol); label.AddText(" "); - label.AddStaticModifier(methodSymbol); + label.AddMethodStaticModifier(methodSymbol); label.AddVirtualModifier(methodSymbol); label.AddAbstractModifier(methodSymbol); label.AddOverrideModifier(methodSymbol); @@ -58,7 +58,7 @@ public static partial class SymbolInfoComponents label.Pop(); } - private static void AddStaticModifier(this RichTextLabel label, IMethodSymbol methodSymbol) + private static void AddMethodStaticModifier(this RichTextLabel label, IMethodSymbol methodSymbol) { if (methodSymbol.IsStatic || methodSymbol.ReducedFrom?.IsStatic is true) { diff --git a/src/SharpIDE.Godot/Features/CodeEditor/SymbolTooltips/FieldTooltip.cs b/src/SharpIDE.Godot/Features/CodeEditor/SymbolTooltips/FieldTooltip.cs index 7724500..95cf941 100644 --- a/src/SharpIDE.Godot/Features/CodeEditor/SymbolTooltips/FieldTooltip.cs +++ b/src/SharpIDE.Godot/Features/CodeEditor/SymbolTooltips/FieldTooltip.cs @@ -31,7 +31,7 @@ public static partial class SymbolInfoComponents return label; } - private static void AddStaticModifier(this RichTextLabel label, IFieldSymbol symbol) + private static void AddStaticModifier(this RichTextLabel label, ISymbol symbol) { if (symbol.IsStatic) { diff --git a/src/SharpIDE.Godot/Features/CodeEditor/SymbolTooltips/PropertyTooltip.cs b/src/SharpIDE.Godot/Features/CodeEditor/SymbolTooltips/PropertyTooltip.cs new file mode 100644 index 0000000..2734034 --- /dev/null +++ b/src/SharpIDE.Godot/Features/CodeEditor/SymbolTooltips/PropertyTooltip.cs @@ -0,0 +1,107 @@ +using Godot; +using Microsoft.CodeAnalysis; + +namespace SharpIDE.Godot.Features.CodeEditor; + +public partial class SymbolInfoComponents +{ + public static Control GetPropertySymbolInfo(IPropertySymbol symbol) + { + var label = new RichTextLabel(); + label.FitContent = true; + label.AutowrapMode = TextServer.AutowrapMode.Off; + label.SetAnchorsPreset(Control.LayoutPreset.FullRect); + label.PushColor(CachedColors.White); + label.PushFont(MonospaceFont); + label.AddAttributes(symbol); + label.AddAccessibilityModifier(symbol); + label.AddText(" "); + label.AddStaticModifier(symbol); + label.AddReadonlyModifier(symbol); + label.AddVirtualModifier(symbol); + label.AddAbstractModifier(symbol); + label.AddOverrideModifier(symbol); + label.AddPropertyTypeName(symbol); + label.AddPropertyName(symbol); + label.AddGetSetAccessors(symbol); + label.AddContainingNamespaceAndClass(symbol); + + label.Pop(); + label.Pop(); + return label; + } + + private static void AddReadonlyModifier(this RichTextLabel label, IPropertySymbol symbol) + { + if (symbol.IsReadOnly) + { + label.PushColor(CachedColors.KeywordBlue); + label.AddText("readonly"); + label.Pop(); + label.AddText(" "); + } + } + + private static void AddPropertyTypeName(this RichTextLabel label, IPropertySymbol symbol) + { + label.PushColor(GetSymbolColourByType(symbol.Type)); + label.AddText(symbol.Type.ToDisplayString(SymbolDisplayFormat.MinimallyQualifiedFormat)); + label.Pop(); + label.AddText(" "); + } + + private static void AddPropertyName(this RichTextLabel label, IPropertySymbol symbol) + { + label.PushColor(CachedColors.White); + label.AddText(symbol.Name); + label.Pop(); + } + + private static void AddGetSetAccessors(this RichTextLabel label, IPropertySymbol symbol) + { + label.AddText(" { "); + + if (symbol.GetMethod is not null) + { + label.PushColor(CachedColors.KeywordBlue); + label.AddText("get"); + label.Pop(); + label.PushColor(CachedColors.White); + label.AddText(";"); + label.Pop(); + label.AddText(" "); + } + if (symbol.SetMethod is {} setMethod) + { + if (setMethod.DeclaredAccessibility != symbol.DeclaredAccessibility) + { + label.PushColor(CachedColors.KeywordBlue); + label.AddText(setMethod.DeclaredAccessibility.ToString().ToLower()); + label.Pop(); + label.AddText(" "); + } + + if (setMethod.IsInitOnly) + { + label.PushColor(CachedColors.KeywordBlue); + label.AddText("init"); + label.Pop(); + label.PushColor(CachedColors.White); + label.AddText(";"); + label.Pop(); + } + else + { + label.PushColor(CachedColors.KeywordBlue); + label.AddText("set"); + label.Pop(); + label.PushColor(CachedColors.White); + label.AddText(";"); + label.Pop(); + } + + label.AddText(" "); + } + label.AddText("}"); + } +} \ No newline at end of file