Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ internal sealed class EntityControllerSyntaxReceiver : ISyntaxContextReceiver
{
private const string IEntityControllerMetadataName = "KubeOps.Abstractions.Reconciliation.Controller.IEntityController`1";

#pragma warning disable RS1024
private readonly HashSet<INamedTypeSymbol> _visitedTypeSymbols = new(SymbolEqualityComparer.Default);
#pragma warning restore RS1024

public List<(ClassDeclarationSyntax Controller, string EntityName)> Controllers { get; } = [];

public void OnVisitSyntaxNode(GeneratorSyntaxContext context)
Expand All @@ -25,6 +29,11 @@ public void OnVisitSyntaxNode(GeneratorSyntaxContext context)
return;
}

if (!_visitedTypeSymbols.Add(classSymbol))
{
return;
}

if (classSymbol.IsAbstract)
{
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ internal sealed class EntityFinalizerSyntaxReceiver : ISyntaxContextReceiver
{
private const string IEntityFinalizerMetadataName = "KubeOps.Abstractions.Reconciliation.Finalizer.IEntityFinalizer`1";

#pragma warning disable RS1024
private readonly HashSet<INamedTypeSymbol> _visitedTypeSymbols = new(SymbolEqualityComparer.Default);
#pragma warning restore RS1024

public List<(ClassDeclarationSyntax Finalizer, string EntityName)> Finalizer { get; } = [];

public void OnVisitSyntaxNode(GeneratorSyntaxContext context)
Expand All @@ -25,6 +29,11 @@ public void OnVisitSyntaxNode(GeneratorSyntaxContext context)
return;
}

if (!_visitedTypeSymbols.Add(classSymbol))
{
return;
}

if (classSymbol.IsAbstract)
{
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,40 @@ public sealed class V1TestEntityController : EntityControllerBase<V1TestEntity>
#pragma warning disable CS1591
using KubeOps.Abstractions.Builder;

public static class ControllerRegistrations
{
public static IOperatorBuilder RegisterControllers(this IOperatorBuilder builder)
{
builder.AddController<global::V1TestEntityController, global::V1TestEntity>();
return builder;
}
}
""")]
[InlineData("""
using k8s;
using k8s.Models;
using KubeOps.Abstractions.Reconciliation.Controller;

[KubernetesEntity(Group = "testing.dev", ApiVersion = "v1", Kind = "TestEntity")]
public sealed class V1TestEntity : IKubernetesObject<V1ObjectMeta>
{
}

public partial class V1TestEntityController : IEntityController<V1TestEntity>
{
}

public partial class V1TestEntityController
{
}
""", """
// <auto-generated>
// This code was generated by a tool.
// Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
// </auto-generated>
#pragma warning disable CS1591
using KubeOps.Abstractions.Builder;

public static class ControllerRegistrations
{
public static IOperatorBuilder RegisterControllers(this IOperatorBuilder builder)
Expand Down
35 changes: 35 additions & 0 deletions test/KubeOps.Generator.Test/FinalizerRegistrationGenerator.Test.cs
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,41 @@ public sealed class V1TestEntity : IKubernetesObject<V1ObjectMeta>
{
}
public partial class V1TestEntityFinalizer : IEntityFinalizer<V1TestEntity>
{
}
public partial class V1TestEntityFinalizer : IEntityFinalizer<V1TestEntity>
{
}
""", """
// <auto-generated>
// This code was generated by a tool.
// Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
// </auto-generated>
#pragma warning disable CS1591
using KubeOps.Abstractions.Builder;
public static class FinalizerRegistrations
{
public const string V1TestEntityFinalizerIdentifier = "testing.dev/v1testentityfinalizer";
public static IOperatorBuilder RegisterFinalizers(this IOperatorBuilder builder)
{
builder.AddFinalizer<global::V1TestEntityFinalizer, global::V1TestEntity>(V1TestEntityFinalizerIdentifier);
return builder;
}
}
""")]
[InlineData("""
using k8s;
using k8s.Models;
using KubeOps.Abstractions.Reconciliation.Finalizer;
[KubernetesEntity(Group = "testing.dev", ApiVersion = "v1", Kind = "TestEntity")]
public sealed class V1TestEntity : IKubernetesObject<V1ObjectMeta>
{
}
public sealed class V1TestEntityCleanupDeployment : IEntityFinalizer<V1TestEntity>
{
}
Expand Down