From 8946aa10796923e8c098426f610ad08da54d2a0e Mon Sep 17 00:00:00 2001 From: Matt Parker <61717342+MattParkerDev@users.noreply.github.com> Date: Mon, 27 Oct 2025 21:25:47 +1000 Subject: [PATCH] keyword icon v1 --- .../Features/CodeEditor/SharpIdeCodeEdit.cs | 7 ++- .../SharpIdeCodeEdit_Completions.cs | 5 +- .../Completions/Resources/keyword-icon.svg | 51 +++++++++++++++++++ .../Resources/keyword-icon.svg.import | 43 ++++++++++++++++ 4 files changed, 103 insertions(+), 3 deletions(-) create mode 100644 src/SharpIDE.Godot/Features/Completions/Resources/keyword-icon.svg create mode 100644 src/SharpIDE.Godot/Features/Completions/Resources/keyword-icon.svg.import diff --git a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs index c8863b3..e52f018 100644 --- a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs +++ b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit.cs @@ -5,6 +5,7 @@ using Microsoft.CodeAnalysis.CodeActions; using Microsoft.CodeAnalysis.Completion; using Microsoft.CodeAnalysis.Rename.ConflictEngine; using Microsoft.CodeAnalysis.Shared.Extensions; +using Microsoft.CodeAnalysis.Tags; using Microsoft.CodeAnalysis.Text; using Roslyn.Utilities; using SharpIDE.Application; @@ -443,8 +444,9 @@ public partial class SharpIdeCodeEdit : CodeEdit { var symbolKindString = CollectionExtensions.GetValueOrDefault(completionItem.Properties, "SymbolKind"); var symbolKind = symbolKindString is null ? null : (SymbolKind?)int.Parse(symbolKindString); + var wellKnownTags = completionItem.Tags; var typeKindString = completionItem.Tags[0]; - var accessibilityModifierString = completionItem.Tags.Skip(1).FirstOrDefault(); // accessibility is not always supplied + var accessibilityModifierString = completionItem.Tags.Skip(1).FirstOrDefault(); // accessibility is not always supplied, and I don't think there's actually any guarantee on the order of tags. See WellKnownTags and WellKnownTagArrays TypeKind? typeKind = Enum.TryParse(typeKindString, out var tk) ? tk : null; Accessibility? accessibilityModifier = Enum.TryParse(accessibilityModifierString, out var am) ? am : null; var godotCompletionType = symbolKind switch @@ -456,7 +458,8 @@ public partial class SharpIdeCodeEdit : CodeEdit SymbolKind.Field => CodeCompletionKind.Member, _ => CodeCompletionKind.PlainText }; - var icon = GetIconForCompletion(symbolKind, typeKind, accessibilityModifier); + var isKeyword = wellKnownTags.Contains(WellKnownTags.Keyword); + var icon = GetIconForCompletion(symbolKind, typeKind, accessibilityModifier, isKeyword); AddCodeCompletionOption(godotCompletionType, completionItem.DisplayText, completionItem.DisplayText, icon: icon, value: new RefCountedContainer(completionItem)); } // partially working - displays menu only when caret is what CodeEdit determines as valid diff --git a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit_Completions.cs b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit_Completions.cs index a126d88..99bd85d 100644 --- a/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit_Completions.cs +++ b/src/SharpIDE.Godot/Features/CodeEditor/SharpIdeCodeEdit_Completions.cs @@ -11,9 +11,12 @@ public partial class SharpIdeCodeEdit private readonly Texture2D _localVariableIcon = ResourceLoader.Load("uid://vwvkxlnvqqk3"); private readonly Texture2D _fieldIcon = ResourceLoader.Load("uid://c4y7d5m4upfju"); private readonly Texture2D _propertyIcon = ResourceLoader.Load("uid://y5pwrwwrjqmc"); + private readonly Texture2D _keywordIcon = ResourceLoader.Load("uid://b0ujhoq2xg2v0"); + // namespace - private Texture2D? GetIconForCompletion(SymbolKind? symbolKind, TypeKind? typeKind, Accessibility? accessibility) + private Texture2D? GetIconForCompletion(SymbolKind? symbolKind, TypeKind? typeKind, Accessibility? accessibility, bool isKeyword) { + if (isKeyword) return _keywordIcon; var texture = (symbolKind, typeKind, accessibility) switch { (SymbolKind.Method, _, _) => _csharpMethodIcon, diff --git a/src/SharpIDE.Godot/Features/Completions/Resources/keyword-icon.svg b/src/SharpIDE.Godot/Features/Completions/Resources/keyword-icon.svg new file mode 100644 index 0000000..dcffeb2 --- /dev/null +++ b/src/SharpIDE.Godot/Features/Completions/Resources/keyword-icon.svg @@ -0,0 +1,51 @@ + + + + + + + + diff --git a/src/SharpIDE.Godot/Features/Completions/Resources/keyword-icon.svg.import b/src/SharpIDE.Godot/Features/Completions/Resources/keyword-icon.svg.import new file mode 100644 index 0000000..d881975 --- /dev/null +++ b/src/SharpIDE.Godot/Features/Completions/Resources/keyword-icon.svg.import @@ -0,0 +1,43 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b0ujhoq2xg2v0" +path="res://.godot/imported/keyword-icon.svg-20e9c90a91a77ec5e809420653cd3822.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Features/Completions/Resources/keyword-icon.svg" +dest_files=["res://.godot/imported/keyword-icon.svg-20e9c90a91a77ec5e809420653cd3822.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/uastc_level=0 +compress/rdo_quality_loss=0.0 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/channel_remap/red=0 +process/channel_remap/green=1 +process/channel_remap/blue=2 +process/channel_remap/alpha=3 +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 +svg/scale=0.1 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false