IEnumerable <MemberDeclarationSyntax> TransformStruct(TypeDefinition def)
        {
            var topDecl = ClassDeclaration(_names.MakeTypeName(def).Identifier)
                          .AddModifiers(Public)
                          .AddBaseListTypes(SimpleBaseType(Type <Capnp.ICapnpSerializable>()));

            if (def.GenericParameters.Count > 0)
            {
                topDecl = topDecl
                          .AddTypeParameterListParameters(MakeTypeParameters(def).ToArray())
                          .AddConstraintClauses(MakeTypeParameterConstraints(def).ToArray());
            }

            topDecl = topDecl.AddMembers(CommonSnippetGen.MakeTypeIdConst(def.Id, _names));
            topDecl = topDecl.WithAttributeLists(CommonSnippetGen.MakeTypeIdAttributeLists(def.Id));

            if (def.UnionInfo != null)
            {
                topDecl = topDecl.AddMembers(_commonGen.MakeUnionSelectorEnum(def));
            }

            topDecl = topDecl.AddMembers(_domClassGen.MakeDomainClassMembers(def));
            topDecl = topDecl.AddMembers(_readerGen.MakeReaderStruct(def));
            topDecl = topDecl.AddMembers(_writerGen.MakeWriterStruct(def));

            foreach (var nestedGroup in def.NestedGroups)
            {
                topDecl = topDecl.AddMembers(Transform(nestedGroup).ToArray());
            }

            foreach (var nestedDef in def.NestedTypes)
            {
                topDecl = topDecl.AddMembers(Transform(nestedDef).ToArray());
            }

            yield return(topDecl);
        }