From f2134a8fb37f4e9abd002bd2423f6c2a5ccd7cae Mon Sep 17 00:00:00 2001 From: Flero Date: Sat, 7 Nov 2026 20:33:05 +1030 Subject: [PATCH] Create declaring types when creating a CodeBuilder for ITypeSymbol. --- src/CodeGenHelpers/CodeBuilder.cs | 40 ++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/CodeGenHelpers/CodeBuilder.cs b/src/CodeGenHelpers/CodeBuilder.cs index a1f282c..ee1b838 100644 --- a/src/CodeGenHelpers/CodeBuilder.cs +++ b/src/CodeGenHelpers/CodeBuilder.cs @@ -69,10 +69,48 @@ public static CodeBuilder Create(INamespaceSymbol namespaceSymbol, IndentStyle i public static ClassBuilder Create(ITypeSymbol typeSymbol, IndentStyle indentStyle = IndentStyle.Spaces) { + var containingTypes = new List(); + + if (typeSymbol.ContainingType != null) + { + var currentType = typeSymbol; + + while (currentType.ContainingType is { } containingType) + { + containingTypes.Add(containingType); + currentType = containingType; + } + + containingTypes.Reverse(); + } + var builder = Create(typeSymbol.ContainingNamespace, indentStyle); - return builder.AddClass(typeSymbol.Name) + ClassBuilder? classBuilder = null; + + foreach (var containingType in containingTypes) + { + classBuilder = AddClass(containingType.Name) + .WithAccessModifier(containingType.DeclaredAccessibility) + .OfType(containingType.TypeKind); + } + + return AddClass(typeSymbol.Name) .WithAccessModifier(typeSymbol.DeclaredAccessibility) .OfType(typeSymbol.TypeKind); + + ClassBuilder AddClass(string name) + { + if (classBuilder != null) + { + classBuilder = classBuilder.AddNestedClass(name, true); + } + else + { + classBuilder = builder.AddClass(name); + } + + return classBuilder; + } } public CodeBuilder AddNamespaceImport(string importedNamespace)