Skip to content

Commit 667db78

Browse files
authored
test(generators): cover domain events and sidecar (#437)
1 parent 0265d44 commit 667db78

4 files changed

Lines changed: 401 additions & 79 deletions

File tree

src/PatternKit.Generators/DomainEvents/DomainEventDispatcherGenerator.cs

Lines changed: 52 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -132,32 +132,68 @@ private static string GenerateSource(
132132
sb.AppendLine();
133133
}
134134

135-
sb.Append(GetAccessibility(type.DeclaredAccessibility)).Append(' ');
136-
if (type.IsStatic)
137-
sb.Append("static ");
138-
else if (type.IsAbstract && type.TypeKind == TypeKind.Class)
139-
sb.Append("abstract ");
140-
else if (type.IsSealed && type.TypeKind == TypeKind.Class)
141-
sb.Append("sealed ");
142-
sb.Append("partial ").Append(type.TypeKind == TypeKind.Struct ? "struct" : "class").Append(' ').Append(type.Name).AppendLine();
143-
sb.AppendLine("{");
144-
sb.Append(" public static global::PatternKit.Application.DomainEvents.DomainEventDispatcher<")
135+
var containingTypes = GetContainingTypes(type);
136+
var indentLevel = 0;
137+
foreach (var containingType in containingTypes)
138+
{
139+
AppendTypeDeclaration(sb, containingType, indentLevel);
140+
sb.AppendLine();
141+
sb.AppendLine(new string(' ', indentLevel * 4) + "{");
142+
indentLevel++;
143+
}
144+
145+
AppendTypeDeclaration(sb, type, indentLevel);
146+
sb.AppendLine();
147+
var indent = new string(' ', indentLevel * 4);
148+
sb.AppendLine(indent + "{");
149+
var memberIndent = indent + " ";
150+
var bodyIndent = memberIndent + " ";
151+
sb.Append(memberIndent).Append("public static global::PatternKit.Application.DomainEvents.DomainEventDispatcher<")
145152
.Append(eventBaseName).Append("> ").Append(factoryName).AppendLine("()");
146-
sb.AppendLine(" {");
147-
sb.Append(" var builder = global::PatternKit.Application.DomainEvents.DomainEventDispatcher<")
153+
sb.Append(memberIndent).AppendLine("{");
154+
sb.Append(bodyIndent).Append("var builder = global::PatternKit.Application.DomainEvents.DomainEventDispatcher<")
148155
.Append(eventBaseName).Append(">.Create(\"").Append(Escape(dispatcherName)).AppendLine("\");");
149156
foreach (var handler in handlers)
150157
{
151158
var eventTypeName = handler.EventType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat);
152-
sb.Append(" builder.Handle<").Append(eventTypeName).Append(">(").Append(handler.Method.Name).AppendLine(");");
159+
sb.Append(bodyIndent).Append("builder.Handle<").Append(eventTypeName).Append(">(").Append(handler.Method.Name).AppendLine(");");
160+
}
161+
162+
sb.Append(bodyIndent).AppendLine("return builder.Build();");
163+
sb.AppendLine(memberIndent + "}");
164+
sb.AppendLine(indent + "}");
165+
for (var i = containingTypes.Length - 1; i >= 0; i--)
166+
{
167+
sb.AppendLine(new string(' ', i * 4) + "}");
153168
}
154169

155-
sb.AppendLine(" return builder.Build();");
156-
sb.AppendLine(" }");
157-
sb.AppendLine("}");
158170
return sb.ToString();
159171
}
160172

173+
private static INamedTypeSymbol[] GetContainingTypes(INamedTypeSymbol type)
174+
{
175+
var containingTypes = new Stack<INamedTypeSymbol>();
176+
for (var current = type.ContainingType; current is not null; current = current.ContainingType)
177+
{
178+
containingTypes.Push(current);
179+
}
180+
181+
return containingTypes.ToArray();
182+
}
183+
184+
private static void AppendTypeDeclaration(StringBuilder sb, INamedTypeSymbol type, int indentLevel)
185+
{
186+
sb.Append(new string(' ', indentLevel * 4));
187+
sb.Append(GetAccessibility(type.DeclaredAccessibility)).Append(' ');
188+
if (type.IsStatic)
189+
sb.Append("static ");
190+
else if (type.IsAbstract && type.TypeKind == TypeKind.Class)
191+
sb.Append("abstract ");
192+
else if (type.IsSealed && type.TypeKind == TypeKind.Class)
193+
sb.Append("sealed ");
194+
sb.Append("partial ").Append(type.TypeKind == TypeKind.Struct ? "struct" : "class").Append(' ').Append(type.Name);
195+
}
196+
161197
private static bool IsHandler(IMethodSymbol method, INamedTypeSymbol eventType, INamedTypeSymbol eventBaseType)
162198
=> method.IsStatic
163199
&& !method.IsGenericMethod

src/PatternKit.Generators/Sidecar/SidecarGenerator.cs

Lines changed: 53 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.Generic;
12
using System.Linq;
23
using System.Text;
34
using Microsoft.CodeAnalysis;
@@ -171,29 +172,65 @@ private static string GenerateSource(INamedTypeSymbol type, INamedTypeSymbol req
171172
sb.AppendLine();
172173
}
173174

175+
var containingTypes = GetContainingTypes(type);
176+
var indentLevel = 0;
177+
foreach (var containingType in containingTypes)
178+
{
179+
AppendTypeDeclaration(sb, containingType, indentLevel);
180+
sb.AppendLine();
181+
sb.AppendLine(new string(' ', indentLevel * 4) + "{");
182+
indentLevel++;
183+
}
184+
185+
AppendTypeDeclaration(sb, type, indentLevel);
186+
sb.AppendLine();
187+
var indent = new string(' ', indentLevel * 4);
188+
sb.AppendLine(indent + "{");
189+
var memberIndent = indent + " ";
190+
var bodyIndent = memberIndent + " ";
191+
sb.Append(memberIndent).Append("public static global::PatternKit.Cloud.Sidecar.Sidecar<")
192+
.Append(requestTypeName).Append(", ").Append(responseTypeName).Append("> ").Append(factoryMethodName).AppendLine("()");
193+
sb.Append(memberIndent).AppendLine("{");
194+
sb.Append(bodyIndent).Append("return global::PatternKit.Cloud.Sidecar.Sidecar<")
195+
.Append(requestTypeName).Append(", ").Append(responseTypeName).Append(">.Create(\"").Append(Escape(sidecarName)).AppendLine("\")");
196+
foreach (var step in before)
197+
sb.Append(bodyIndent).Append(" .Before(\"").Append(Escape(step.Name)).Append("\", ").Append(step.Method.Name).AppendLine(")");
198+
foreach (var step in after)
199+
sb.Append(bodyIndent).Append(" .After(\"").Append(Escape(step.Name)).Append("\", ").Append(step.Method.Name).AppendLine(")");
200+
sb.Append(bodyIndent).Append(" .Handle(").Append(handlerName).AppendLine(")");
201+
sb.Append(bodyIndent).AppendLine(" .Build();");
202+
sb.AppendLine(memberIndent + "}");
203+
sb.AppendLine(indent + "}");
204+
for (var i = containingTypes.Length - 1; i >= 0; i--)
205+
{
206+
sb.AppendLine(new string(' ', i * 4) + "}");
207+
}
208+
209+
return sb.ToString();
210+
}
211+
212+
private static INamedTypeSymbol[] GetContainingTypes(INamedTypeSymbol type)
213+
{
214+
var containingTypes = new Stack<INamedTypeSymbol>();
215+
for (var current = type.ContainingType; current is not null; current = current.ContainingType)
216+
{
217+
containingTypes.Push(current);
218+
}
219+
220+
return containingTypes.ToArray();
221+
}
222+
223+
private static void AppendTypeDeclaration(StringBuilder sb, INamedTypeSymbol type, int indentLevel)
224+
{
225+
sb.Append(new string(' ', indentLevel * 4));
174226
sb.Append(GetAccessibility(type.DeclaredAccessibility)).Append(' ');
175227
if (type.IsStatic)
176228
sb.Append("static ");
177229
else if (type.IsAbstract && type.TypeKind == TypeKind.Class)
178230
sb.Append("abstract ");
179231
else if (type.IsSealed && type.TypeKind == TypeKind.Class)
180232
sb.Append("sealed ");
181-
sb.Append("partial ").Append(type.TypeKind == TypeKind.Struct ? "struct" : "class").Append(' ').Append(type.Name).AppendLine();
182-
sb.AppendLine("{");
183-
sb.Append(" public static global::PatternKit.Cloud.Sidecar.Sidecar<")
184-
.Append(requestTypeName).Append(", ").Append(responseTypeName).Append("> ").Append(factoryMethodName).AppendLine("()");
185-
sb.AppendLine(" {");
186-
sb.Append(" return global::PatternKit.Cloud.Sidecar.Sidecar<")
187-
.Append(requestTypeName).Append(", ").Append(responseTypeName).Append(">.Create(\"").Append(Escape(sidecarName)).AppendLine("\")");
188-
foreach (var step in before)
189-
sb.Append(" .Before(\"").Append(Escape(step.Name)).Append("\", ").Append(step.Method.Name).AppendLine(")");
190-
foreach (var step in after)
191-
sb.Append(" .After(\"").Append(Escape(step.Name)).Append("\", ").Append(step.Method.Name).AppendLine(")");
192-
sb.Append(" .Handle(").Append(handlerName).AppendLine(")");
193-
sb.AppendLine(" .Build();");
194-
sb.AppendLine(" }");
195-
sb.AppendLine("}");
196-
return sb.ToString();
233+
sb.Append("partial ").Append(type.TypeKind == TypeKind.Struct ? "struct" : "class").Append(' ').Append(type.Name);
197234
}
198235

199236
private static string? GetNamedString(AttributeData attribute, string name)

0 commit comments

Comments
 (0)