ClassDeclarationSyntax TransformForPipeliningSupport(GenFile file)
        {
            var classDecl = default(ClassDeclarationSyntax);

            var q = new Queue <TypeDefinition>();

            foreach (var inner in file.NestedTypes)
            {
                q.Enqueue(inner);
            }

            while (q.Count > 0)
            {
                var cur = q.Dequeue();

                if (cur.Tag == TypeTag.Interface && _interfaceGen.RequiresPipeliningSupport(cur))
                {
                    var members = _interfaceGen.MakePipeliningSupport(cur).ToArray();

                    if (members.Length > 0)
                    {
                        if (classDecl == null)
                        {
                            classDecl = ClassDeclaration(_names.MakePipeliningSupportExtensionClassName(file).Identifier)
                                        .AddModifiers(Public, Static, Partial);
                        }

                        classDecl = classDecl.AddMembers(members);
                    }
                }

                foreach (var inner in cur.NestedTypes)
                {
                    q.Enqueue(inner);
                }
            }

            return(classDecl);
        }