|
| 1 | +using System.Collections.Generic; |
1 | 2 | using System.Linq; |
2 | 3 | using System.Text; |
3 | 4 | using Microsoft.CodeAnalysis; |
@@ -171,29 +172,65 @@ private static string GenerateSource(INamedTypeSymbol type, INamedTypeSymbol req |
171 | 172 | sb.AppendLine(); |
172 | 173 | } |
173 | 174 |
|
| 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)); |
174 | 226 | sb.Append(GetAccessibility(type.DeclaredAccessibility)).Append(' '); |
175 | 227 | if (type.IsStatic) |
176 | 228 | sb.Append("static "); |
177 | 229 | else if (type.IsAbstract && type.TypeKind == TypeKind.Class) |
178 | 230 | sb.Append("abstract "); |
179 | 231 | else if (type.IsSealed && type.TypeKind == TypeKind.Class) |
180 | 232 | 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); |
197 | 234 | } |
198 | 235 |
|
199 | 236 | private static string? GetNamedString(AttributeData attribute, string name) |
|
0 commit comments