From cdf94b3e0cb55777df042e653999754f97ebaba8 Mon Sep 17 00:00:00 2001 From: hzhang Date: Sun, 9 Feb 2025 01:07:12 +0000 Subject: [PATCH] add: LoadingScene, ProxyNode --- Polonium.Generators.csproj | 2 +- .../AssetRegisterGenerator.cs | 2 +- .../GlobalRegistryGenerator.cs | 2 +- src/Generators/ProxyNodeGenerator.cs | 44 +++++++++++++++++++ .../RegistryEntityGenerator.cs | 2 +- 5 files changed, 48 insertions(+), 4 deletions(-) rename src/{ => Generators}/AssetRegisterGenerator.cs (98%) rename src/{ => Generators}/GlobalRegistryGenerator.cs (98%) create mode 100644 src/Generators/ProxyNodeGenerator.cs rename src/{ => Generators}/RegistryEntityGenerator.cs (97%) diff --git a/Polonium.Generators.csproj b/Polonium.Generators.csproj index daf59ba..2483204 100644 --- a/Polonium.Generators.csproj +++ b/Polonium.Generators.csproj @@ -9,7 +9,7 @@ true true true - 0.0.2 + 0.0.5 Hangman Polonium.Generators diff --git a/src/AssetRegisterGenerator.cs b/src/Generators/AssetRegisterGenerator.cs similarity index 98% rename from src/AssetRegisterGenerator.cs rename to src/Generators/AssetRegisterGenerator.cs index cbad384..3fbdf91 100644 --- a/src/AssetRegisterGenerator.cs +++ b/src/Generators/AssetRegisterGenerator.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Text; using Microsoft.CodeAnalysis; -namespace Polonium.Generators; +namespace Polonium.Generators.Generators; [Generator] public class AssetRegisterGenerator : AssetProcessGenerator { diff --git a/src/GlobalRegistryGenerator.cs b/src/Generators/GlobalRegistryGenerator.cs similarity index 98% rename from src/GlobalRegistryGenerator.cs rename to src/Generators/GlobalRegistryGenerator.cs index fdea7ed..239be67 100644 --- a/src/GlobalRegistryGenerator.cs +++ b/src/Generators/GlobalRegistryGenerator.cs @@ -1,7 +1,7 @@ using System.Text; using Microsoft.CodeAnalysis; -namespace Polonium.Generators; +namespace Polonium.Generators.Generators; [Generator] public class GlobalRegistryGenerator : ISourceGenerator { diff --git a/src/Generators/ProxyNodeGenerator.cs b/src/Generators/ProxyNodeGenerator.cs new file mode 100644 index 0000000..0048ac2 --- /dev/null +++ b/src/Generators/ProxyNodeGenerator.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Microsoft.CodeAnalysis; + +namespace Polonium.Generators.Generators; +[Generator] +public class ProxyNodeGenerator : AssetProcessGenerator +{ + private INamedTypeSymbol? NodeProxy { get; set; } + + private IEnumerable ProxyNodesInNamespace(INamespaceSymbol ns) + { + foreach (INamespaceOrTypeSymbol member in ns.GetMembers()) + { + if (member is INamespaceSymbol nsx) + foreach (INamedTypeSymbol nsz in ProxyNodesInNamespace(nsx)) + yield return nsz; + else if (member is INamedTypeSymbol nsu) + if (nsu.GetAttributes().Any(attr => SymbolEqualityComparer.Default.Equals(attr.AttributeClass, NodeProxy))) + yield return nsu; + } + } + + + public override void Execute(GeneratorExecutionContext context) + { + Compilation compilation = context.Compilation; + NodeProxy = compilation.GetTypeByMetadataName("Polonium.Attributes.ProxyNode"); + foreach (INamedTypeSymbol node in ProxyNodesInNamespace(compilation.GlobalNamespace)) + { + StringBuilder sb = new(); + sb + .AppendLine($"namespace Polonium.Nodes;") + .AppendLine("using Godot;") + .AppendLine($"[GlobalClass]") + .AppendLine($"[Tool]") + .AppendLine($"public partial class {node.Name} : {node.ToDisplayString()}") + .AppendLine("{") + .AppendLine("}"); + context.AddSource($"NodeProxy_{node.Name}.g.cs", sb.ToString()); + } + } +} \ No newline at end of file diff --git a/src/RegistryEntityGenerator.cs b/src/Generators/RegistryEntityGenerator.cs similarity index 97% rename from src/RegistryEntityGenerator.cs rename to src/Generators/RegistryEntityGenerator.cs index 9de7a7c..e32b3c6 100644 --- a/src/RegistryEntityGenerator.cs +++ b/src/Generators/RegistryEntityGenerator.cs @@ -2,7 +2,7 @@ using System.Linq; using System.Text; using Microsoft.CodeAnalysis; -namespace Polonium.Generators; +namespace Polonium.Generators.Generators; [Generator] public class RegistryEntityGenerator : AssetProcessGenerator {