From d092aa45fb3b1ed4ed053ac6f2162d34886cc2f4 Mon Sep 17 00:00:00 2001 From: Vladislav Panin Date: Sun, 11 Jan 2026 13:44:37 +0300 Subject: [PATCH 1/4] Upgrade context menu generator --- ...or.cs => AddBinderContextMenuGenerator.cs} | 31 +++++++++++-------- .../Generators/Descriptions/Classes.Aspid.cs | 4 +-- 2 files changed, 20 insertions(+), 15 deletions(-) rename Aspid.MVVM.Unity.Generators/Aspid.MVVM.Unity.Generators/Generators/ContextMenu/{AddComponentContextMenuGenerator.cs => AddBinderContextMenuGenerator.cs} (79%) diff --git a/Aspid.MVVM.Unity.Generators/Aspid.MVVM.Unity.Generators/Generators/ContextMenu/AddComponentContextMenuGenerator.cs b/Aspid.MVVM.Unity.Generators/Aspid.MVVM.Unity.Generators/Generators/ContextMenu/AddBinderContextMenuGenerator.cs similarity index 79% rename from Aspid.MVVM.Unity.Generators/Aspid.MVVM.Unity.Generators/Generators/ContextMenu/AddComponentContextMenuGenerator.cs rename to Aspid.MVVM.Unity.Generators/Aspid.MVVM.Unity.Generators/Generators/ContextMenu/AddBinderContextMenuGenerator.cs index 6f084c2..6766d78 100644 --- a/Aspid.MVVM.Unity.Generators/Aspid.MVVM.Unity.Generators/Generators/ContextMenu/AddComponentContextMenuGenerator.cs +++ b/Aspid.MVVM.Unity.Generators/Aspid.MVVM.Unity.Generators/Generators/ContextMenu/AddBinderContextMenuGenerator.cs @@ -11,11 +11,11 @@ namespace Aspid.MVVM.Unity.Generators.ContextMenu; [Generator(LanguageNames.CSharp)] -public sealed class AddComponentContextMenuGenerator : IIncrementalGenerator +public sealed class AddBinderContextMenuGenerator : IIncrementalGenerator { public void Initialize(IncrementalGeneratorInitializationContext context) { - var provider = context.SyntaxProvider.ForAttributeWithMetadataName(AddComponentContextMenuAttribute.FullName, SyntacticPredicate, Find) + var provider = context.SyntaxProvider.ForAttributeWithMetadataName(AddBinderContextMenuAttribute.FullName, SyntacticPredicate, Find) .Where(foundForSourceGenerator => foundForSourceGenerator.IsNeed) .Select((foundForSourceGenerator, _) => foundForSourceGenerator.Container); @@ -32,25 +32,30 @@ private static FoundForGenerator Find(GeneratorAttributeSyntaxC var declaration = (ClassDeclarationSyntax)context.TargetNode; if (context.TargetSymbol is not INamedTypeSymbol symbol) return default; - if (symbol.HasAnyAttribute(out var attribute, AddComponentContextMenuAttribute)) + if (symbol.HasAnyAttribute(out var attribute, AddBinderContextMenuAttribute)) { if (attribute!.ConstructorArguments[0].Value is not ITypeSymbol type) return default; - - string? path = null; - if (attribute.ConstructorArguments.Length > 1) - path = attribute.ConstructorArguments[1].Value?.ToString(); - var arguments = attribute.NamedArguments; - var priority = (int)(arguments.FirstOrDefault(pair => pair.Key == "Priority").Value.Value ?? 100001); + var path = arguments.FirstOrDefault(pair => pair.Key == "Path").Value.Value as string; + + if (path is null) + { + if (symbol.HasAnyAttribute(out var addComponentMenuAttribute, "UnityEngine.AddComponentMenu")) + { + path = addComponentMenuAttribute!.ConstructorArguments[0].Value as string; - return new FoundForGenerator(new ContextMenuData(declaration, symbol, symbol.Name, type.Name, path, priority)); + if (path is not null) + path = $"Add {type.Name} Binder" + path.Substring(path.LastIndexOf("/", StringComparison.Ordinal)); + } + + path ??= $"Add {type.Name} Binder/{symbol.Name}"; + } + + return new FoundForGenerator(new ContextMenuData(declaration, symbol, symbol.Name, type.Name, path, 100001)); } return default; - - string? GetName(string? path) => - path?.Substring(path.LastIndexOf("/", StringComparison.Ordinal) + 1); } private static void GenerateCode(SourceProductionContext context, ContextMenuData data) diff --git a/Aspid.MVVM.Unity.Generators/Aspid.MVVM.Unity.Generators/Generators/Descriptions/Classes.Aspid.cs b/Aspid.MVVM.Unity.Generators/Aspid.MVVM.Unity.Generators/Generators/Descriptions/Classes.Aspid.cs index 95040bc..66a6149 100644 --- a/Aspid.MVVM.Unity.Generators/Aspid.MVVM.Unity.Generators/Generators/Descriptions/Classes.Aspid.cs +++ b/Aspid.MVVM.Unity.Generators/Aspid.MVVM.Unity.Generators/Generators/Descriptions/Classes.Aspid.cs @@ -5,6 +5,6 @@ namespace Aspid.MVVM.Generators.Descriptions; // ReSharper disable InconsistentNaming public static partial class Classes { - public static readonly AttributeText AddComponentContextMenuAttribute = - new ("AddComponentContextMenu", Namespaces.Aspid_MVVM); + public static readonly AttributeText AddBinderContextMenuAttribute = + new ("AddBinderContextMenu", Namespaces.Aspid_MVVM); } \ No newline at end of file From 79c4d7af7aa42bdb704188b4033107cfbb031915 Mon Sep 17 00:00:00 2001 From: Vladislav Panin Date: Sat, 7 Feb 2026 14:11:49 +0300 Subject: [PATCH 2/4] Add support for subPath --- .../ContextMenu/AddBinderContextMenuGenerator.cs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/Aspid.MVVM.Unity.Generators/Aspid.MVVM.Unity.Generators/Generators/ContextMenu/AddBinderContextMenuGenerator.cs b/Aspid.MVVM.Unity.Generators/Aspid.MVVM.Unity.Generators/Generators/ContextMenu/AddBinderContextMenuGenerator.cs index 6766d78..85143b6 100644 --- a/Aspid.MVVM.Unity.Generators/Aspid.MVVM.Unity.Generators/Generators/ContextMenu/AddBinderContextMenuGenerator.cs +++ b/Aspid.MVVM.Unity.Generators/Aspid.MVVM.Unity.Generators/Generators/ContextMenu/AddBinderContextMenuGenerator.cs @@ -38,7 +38,9 @@ private static FoundForGenerator Find(GeneratorAttributeSyntaxC var arguments = attribute.NamedArguments; var path = arguments.FirstOrDefault(pair => pair.Key == "Path").Value.Value as string; - + var suPath = arguments.FirstOrDefault(pair => pair.Key == "SubPath").Value.Value as string; + suPath = suPath is not null ? $"{suPath}/" : string.Empty; + if (path is null) { if (symbol.HasAnyAttribute(out var addComponentMenuAttribute, "UnityEngine.AddComponentMenu")) @@ -52,6 +54,16 @@ private static FoundForGenerator Find(GeneratorAttributeSyntaxC path ??= $"Add {type.Name} Binder/{symbol.Name}"; } + if (!string.IsNullOrWhiteSpace(path) && !string.IsNullOrWhiteSpace(suPath)) + { + var index = path.IndexOf('/'); + if (index is -1) index = path.Length - 2; + + index++; + if (index >= 0 && index < path.Length) + path = path.Insert(path.IndexOf('/') + 1, suPath); + } + return new FoundForGenerator(new ContextMenuData(declaration, symbol, symbol.Name, type.Name, path, 100001)); } From 8add884a2b248757587fd3e5c1cc20dd21287b3b Mon Sep 17 00:00:00 2001 From: Vladislav Panin Date: Sun, 22 Feb 2026 21:12:12 +0300 Subject: [PATCH 3/4] Add Directory.Build.targets --- Directory.Build.targets | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Directory.Build.targets diff --git a/Directory.Build.targets b/Directory.Build.targets new file mode 100644 index 0000000..112fead --- /dev/null +++ b/Directory.Build.targets @@ -0,0 +1,11 @@ + + + + + <_UnityDestination>$(MSBuildThisFileDirectory)../Aspid.MVVM/Assets/Plugins/Aspid/MVVM/Unity/ + + + + + + From 7e2dfadc823b526fba8dcec0d17385b238fff129 Mon Sep 17 00:00:00 2001 From: Vladislav Panin Date: Fri, 22 May 2026 15:16:32 +0300 Subject: [PATCH 4/4] Update Unity copy path to Aspid/MVVM/Unity after folder move --- Directory.Build.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.targets b/Directory.Build.targets index 112fead..6090a43 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -2,7 +2,7 @@ - <_UnityDestination>$(MSBuildThisFileDirectory)../Aspid.MVVM/Assets/Plugins/Aspid/MVVM/Unity/ + <_UnityDestination>$(MSBuildThisFileDirectory)../Aspid.MVVM/Assets/Aspid/MVVM/Unity/