Skip to content

Commit ebcc0ca

Browse files
authored
test: cover ambassador and canonical data model generators (#434)
1 parent e905949 commit ebcc0ca

4 files changed

Lines changed: 368 additions & 94 deletions

File tree

src/PatternKit.Generators/Ambassador/AmbassadorGenerator.cs

Lines changed: 58 additions & 20 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;
@@ -206,35 +207,72 @@ private static string GenerateSource(
206207
sb.AppendLine();
207208
}
208209

209-
sb.Append(GetAccessibility(type.DeclaredAccessibility)).Append(' ');
210-
if (type.IsStatic)
211-
sb.Append("static ");
212-
else if (type.IsAbstract && type.TypeKind == TypeKind.Class)
213-
sb.Append("abstract ");
214-
else if (type.IsSealed && type.TypeKind == TypeKind.Class)
215-
sb.Append("sealed ");
216-
sb.Append("partial ").Append(type.TypeKind == TypeKind.Struct ? "struct" : "class").Append(' ').Append(type.Name).AppendLine();
217-
sb.AppendLine("{");
218-
sb.Append(" public static global::PatternKit.Cloud.Ambassador.Ambassador<")
210+
var containingTypes = GetContainingTypes(type);
211+
var indentLevel = 0;
212+
foreach (var containingType in containingTypes)
213+
{
214+
AppendTypeDeclaration(sb, containingType, indentLevel);
215+
sb.AppendLine();
216+
sb.AppendLine(new string(' ', indentLevel * 4) + "{");
217+
indentLevel++;
218+
}
219+
220+
AppendTypeDeclaration(sb, type, indentLevel);
221+
sb.AppendLine();
222+
var indent = new string(' ', indentLevel * 4);
223+
sb.AppendLine(indent + "{");
224+
var memberIndent = indent + " ";
225+
var bodyIndent = memberIndent + " ";
226+
var chainIndent = bodyIndent + " ";
227+
sb.Append(memberIndent).Append("public static global::PatternKit.Cloud.Ambassador.Ambassador<")
219228
.Append(requestTypeName).Append(", ").Append(responseTypeName).Append("> ").Append(factoryMethodName).AppendLine("()");
220-
sb.AppendLine(" {");
221-
sb.Append(" return global::PatternKit.Cloud.Ambassador.Ambassador<")
229+
sb.Append(memberIndent).AppendLine("{");
230+
sb.Append(bodyIndent).Append("return global::PatternKit.Cloud.Ambassador.Ambassador<")
222231
.Append(requestTypeName).Append(", ").Append(responseTypeName).Append(">.Create(\"").Append(Escape(ambassadorName)).AppendLine("\")");
223232
foreach (var transform in transforms)
224-
sb.Append(" .Transform(").Append(transform.Name).AppendLine(")");
233+
sb.Append(chainIndent).Append(".Transform(").Append(transform.Name).AppendLine(")");
225234
if (policyName is not null)
226-
sb.Append(" .ConnectionPolicy(").Append(policyName).AppendLine(")");
235+
sb.Append(chainIndent).Append(".ConnectionPolicy(").Append(policyName).AppendLine(")");
227236
foreach (var item in telemetry)
228-
sb.Append(" .Telemetry(\"").Append(Escape(item.Name)).Append("\", ").Append(item.Method.Name).AppendLine(")");
229-
sb.Append(" .Call(").Append(callName).AppendLine(")");
237+
sb.Append(chainIndent).Append(".Telemetry(\"").Append(Escape(item.Name)).Append("\", ").Append(item.Method.Name).AppendLine(")");
238+
sb.Append(chainIndent).Append(".Call(").Append(callName).AppendLine(")");
230239
if (fallbackName is not null)
231-
sb.Append(" .Fallback(").Append(fallbackName).AppendLine(")");
232-
sb.AppendLine(" .Build();");
233-
sb.AppendLine(" }");
234-
sb.AppendLine("}");
240+
sb.Append(chainIndent).Append(".Fallback(").Append(fallbackName).AppendLine(")");
241+
sb.Append(chainIndent).AppendLine(".Build();");
242+
sb.Append(memberIndent).AppendLine("}");
243+
sb.AppendLine(indent + "}");
244+
for (var i = containingTypes.Length - 1; i >= 0; i--)
245+
{
246+
sb.AppendLine(new string(' ', i * 4) + "}");
247+
}
248+
235249
return sb.ToString();
236250
}
237251

252+
private static INamedTypeSymbol[] GetContainingTypes(INamedTypeSymbol type)
253+
{
254+
var containingTypes = new Stack<INamedTypeSymbol>();
255+
for (var current = type.ContainingType; current is not null; current = current.ContainingType)
256+
{
257+
containingTypes.Push(current);
258+
}
259+
260+
return containingTypes.ToArray();
261+
}
262+
263+
private static void AppendTypeDeclaration(StringBuilder sb, INamedTypeSymbol type, int indentLevel)
264+
{
265+
sb.Append(new string(' ', indentLevel * 4));
266+
sb.Append(GetAccessibility(type.DeclaredAccessibility)).Append(' ');
267+
if (type.IsStatic)
268+
sb.Append("static ");
269+
else if (type.IsAbstract && type.TypeKind == TypeKind.Class)
270+
sb.Append("abstract ");
271+
else if (type.IsSealed && type.TypeKind == TypeKind.Class)
272+
sb.Append("sealed ");
273+
sb.Append("partial ").Append(type.TypeKind == TypeKind.Struct ? "struct" : "class").Append(' ').Append(type.Name);
274+
}
275+
238276
private static string? GetNamedString(AttributeData attribute, string name)
239277
=> attribute.NamedArguments.FirstOrDefault(kv => kv.Key == name).Value.Value as string;
240278

src/PatternKit.Generators/CanonicalDataModel/CanonicalDataModelGenerator.cs

Lines changed: 48 additions & 10 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;
@@ -114,23 +115,60 @@ private static string GenerateSource(
114115
sb.AppendLine();
115116
}
116117

118+
var containingTypes = GetContainingTypes(type);
119+
var indentLevel = 0;
120+
foreach (var containingType in containingTypes)
121+
{
122+
AppendTypeDeclaration(sb, containingType, indentLevel);
123+
sb.AppendLine();
124+
sb.AppendLine(new string(' ', indentLevel * 4) + "{");
125+
indentLevel++;
126+
}
127+
128+
AppendTypeDeclaration(sb, type, indentLevel);
129+
sb.AppendLine();
130+
var indent = new string(' ', indentLevel * 4);
131+
sb.AppendLine(indent + "{");
132+
var memberIndent = indent + " ";
133+
var bodyIndent = memberIndent + " ";
134+
var chainIndent = bodyIndent + " ";
135+
sb.Append(memberIndent).Append("public static global::PatternKit.EnterpriseIntegration.CanonicalDataModel.CanonicalDataModel<").Append(canonicalTypeName).Append("> ").Append(factoryMethodName).AppendLine("()");
136+
sb.Append(memberIndent).AppendLine("{");
137+
sb.Append(bodyIndent).Append("return global::PatternKit.EnterpriseIntegration.CanonicalDataModel.CanonicalDataModel<").Append(canonicalTypeName).Append(">.Create(\"").Append(Escape(modelName)).AppendLine("\")");
138+
sb.Append(chainIndent).Append(".From<").Append(sourceTypeName).Append(">(\"").Append(Escape(adapterName)).Append("\", ").Append(mapperName).AppendLine(")");
139+
sb.Append(chainIndent).AppendLine(".Build();");
140+
sb.Append(memberIndent).AppendLine("}");
141+
sb.AppendLine(indent + "}");
142+
for (var i = containingTypes.Length - 1; i >= 0; i--)
143+
{
144+
sb.AppendLine(new string(' ', i * 4) + "}");
145+
}
146+
147+
return sb.ToString();
148+
}
149+
150+
private static INamedTypeSymbol[] GetContainingTypes(INamedTypeSymbol type)
151+
{
152+
var containingTypes = new Stack<INamedTypeSymbol>();
153+
for (var current = type.ContainingType; current is not null; current = current.ContainingType)
154+
{
155+
containingTypes.Push(current);
156+
}
157+
158+
return containingTypes.ToArray();
159+
}
160+
161+
private static void AppendTypeDeclaration(StringBuilder sb, INamedTypeSymbol type, int indentLevel)
162+
{
163+
sb.Append(new string(' ', indentLevel * 4));
117164
sb.Append(GetAccessibility(type.DeclaredAccessibility)).Append(' ');
118165
if (type.IsStatic)
119166
sb.Append("static ");
120167
else if (type.IsAbstract && type.TypeKind == TypeKind.Class)
121168
sb.Append("abstract ");
122169
else if (type.IsSealed && type.TypeKind == TypeKind.Class)
123170
sb.Append("sealed ");
124-
sb.Append("partial ").Append(type.TypeKind == TypeKind.Struct ? "struct" : "class").Append(' ').Append(type.Name).AppendLine();
125-
sb.AppendLine("{");
126-
sb.Append(" public static global::PatternKit.EnterpriseIntegration.CanonicalDataModel.CanonicalDataModel<").Append(canonicalTypeName).Append("> ").Append(factoryMethodName).AppendLine("()");
127-
sb.AppendLine(" {");
128-
sb.Append(" return global::PatternKit.EnterpriseIntegration.CanonicalDataModel.CanonicalDataModel<").Append(canonicalTypeName).Append(">.Create(\"").Append(Escape(modelName)).AppendLine("\")");
129-
sb.Append(" .From<").Append(sourceTypeName).Append(">(\"").Append(Escape(adapterName)).Append("\", ").Append(mapperName).AppendLine(")");
130-
sb.AppendLine(" .Build();");
131-
sb.AppendLine(" }");
132-
sb.AppendLine("}");
133-
return sb.ToString();
171+
sb.Append("partial ").Append(type.TypeKind == TypeKind.Struct ? "struct" : "class").Append(' ').Append(type.Name);
134172
}
135173

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

0 commit comments

Comments
 (0)