public static Typ Of(MessageDescriptor desc) { if (s_wrapperTypes.TryGetValue(desc.FullName, out var wkt)) { return(wkt); } var ns = desc.File.CSharpNamespace(); var isDeprecated = desc.IsDeprecated(); var decls = new List <MessageDescriptor>(); do { decls.Add(desc); desc = desc.ContainingType; } while (desc != null); decls.Reverse(); var typ = Manual(ns, decls[0].Name, isDeprecated: isDeprecated); foreach (var decl in decls.Skip(1)) { typ = Nested(Nested(typ, "Types"), decl.Name); } return(typ); }