Skip to content

Commit 4d43612

Browse files
authored
fix: update syntax receiver to handle visited type symbols only once (#997)
Fix #996
1 parent 06c65ba commit 4d43612

File tree

4 files changed

+87
-0
lines changed

4 files changed

+87
-0
lines changed

src/KubeOps.Generator/SyntaxReceiver/EntityControllerSyntaxReceiver.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ internal sealed class EntityControllerSyntaxReceiver : ISyntaxContextReceiver
1111
{
1212
private const string IEntityControllerMetadataName = "KubeOps.Abstractions.Reconciliation.Controller.IEntityController`1";
1313

14+
#pragma warning disable RS1024
15+
private readonly HashSet<INamedTypeSymbol> _visitedTypeSymbols = new(SymbolEqualityComparer.Default);
16+
#pragma warning restore RS1024
17+
1418
public List<(ClassDeclarationSyntax Controller, string EntityName)> Controllers { get; } = [];
1519

1620
public void OnVisitSyntaxNode(GeneratorSyntaxContext context)
@@ -25,6 +29,11 @@ public void OnVisitSyntaxNode(GeneratorSyntaxContext context)
2529
return;
2630
}
2731

32+
if (!_visitedTypeSymbols.Add(classSymbol))
33+
{
34+
return;
35+
}
36+
2837
if (classSymbol.IsAbstract)
2938
{
3039
return;

src/KubeOps.Generator/SyntaxReceiver/EntityFinalizerSyntaxReceiver.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ internal sealed class EntityFinalizerSyntaxReceiver : ISyntaxContextReceiver
1111
{
1212
private const string IEntityFinalizerMetadataName = "KubeOps.Abstractions.Reconciliation.Finalizer.IEntityFinalizer`1";
1313

14+
#pragma warning disable RS1024
15+
private readonly HashSet<INamedTypeSymbol> _visitedTypeSymbols = new(SymbolEqualityComparer.Default);
16+
#pragma warning restore RS1024
17+
1418
public List<(ClassDeclarationSyntax Finalizer, string EntityName)> Finalizer { get; } = [];
1519

1620
public void OnVisitSyntaxNode(GeneratorSyntaxContext context)
@@ -25,6 +29,11 @@ public void OnVisitSyntaxNode(GeneratorSyntaxContext context)
2529
return;
2630
}
2731

32+
if (!_visitedTypeSymbols.Add(classSymbol))
33+
{
34+
return;
35+
}
36+
2837
if (classSymbol.IsAbstract)
2938
{
3039
return;

test/KubeOps.Generator.Test/ControllerRegistrationGenerator.Test.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,40 @@ public sealed class V1TestEntityController : EntityControllerBase<V1TestEntity>
8888
#pragma warning disable CS1591
8989
using KubeOps.Abstractions.Builder;
9090
91+
public static class ControllerRegistrations
92+
{
93+
public static IOperatorBuilder RegisterControllers(this IOperatorBuilder builder)
94+
{
95+
builder.AddController<global::V1TestEntityController, global::V1TestEntity>();
96+
return builder;
97+
}
98+
}
99+
""")]
100+
[InlineData("""
101+
using k8s;
102+
using k8s.Models;
103+
using KubeOps.Abstractions.Reconciliation.Controller;
104+
105+
[KubernetesEntity(Group = "testing.dev", ApiVersion = "v1", Kind = "TestEntity")]
106+
public sealed class V1TestEntity : IKubernetesObject<V1ObjectMeta>
107+
{
108+
}
109+
110+
public partial class V1TestEntityController : IEntityController<V1TestEntity>
111+
{
112+
}
113+
114+
public partial class V1TestEntityController
115+
{
116+
}
117+
""", """
118+
// <auto-generated>
119+
// This code was generated by a tool.
120+
// Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
121+
// </auto-generated>
122+
#pragma warning disable CS1591
123+
using KubeOps.Abstractions.Builder;
124+
91125
public static class ControllerRegistrations
92126
{
93127
public static IOperatorBuilder RegisterControllers(this IOperatorBuilder builder)

test/KubeOps.Generator.Test/FinalizerRegistrationGenerator.Test.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,41 @@ public sealed class V1TestEntity : IKubernetesObject<V1ObjectMeta>
147147
{
148148
}
149149
150+
public partial class V1TestEntityFinalizer : IEntityFinalizer<V1TestEntity>
151+
{
152+
}
153+
154+
public partial class V1TestEntityFinalizer : IEntityFinalizer<V1TestEntity>
155+
{
156+
}
157+
""", """
158+
// <auto-generated>
159+
// This code was generated by a tool.
160+
// Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
161+
// </auto-generated>
162+
#pragma warning disable CS1591
163+
using KubeOps.Abstractions.Builder;
164+
165+
public static class FinalizerRegistrations
166+
{
167+
public const string V1TestEntityFinalizerIdentifier = "testing.dev/v1testentityfinalizer";
168+
public static IOperatorBuilder RegisterFinalizers(this IOperatorBuilder builder)
169+
{
170+
builder.AddFinalizer<global::V1TestEntityFinalizer, global::V1TestEntity>(V1TestEntityFinalizerIdentifier);
171+
return builder;
172+
}
173+
}
174+
""")]
175+
[InlineData("""
176+
using k8s;
177+
using k8s.Models;
178+
using KubeOps.Abstractions.Reconciliation.Finalizer;
179+
180+
[KubernetesEntity(Group = "testing.dev", ApiVersion = "v1", Kind = "TestEntity")]
181+
public sealed class V1TestEntity : IKubernetesObject<V1ObjectMeta>
182+
{
183+
}
184+
150185
public sealed class V1TestEntityCleanupDeployment : IEntityFinalizer<V1TestEntity>
151186
{
152187
}

0 commit comments

Comments
 (0)