private async Task WriteDeserializeLeafListAsync(
            CodeWriter writer,
            ITypeLookup typeLookup,
            string methodName,
            IType type,
            string schemaTypeName,
            string serializerMethod)
        {
            IType  elementType        = type.ElementType();
            string clrTypeName        = typeLookup.GetLeafClrTypeName(type);
            string clrElementTypeName = typeLookup.GetLeafClrTypeName(elementType);

            await WriteDeserializerMethodAsync(
                writer, methodName, clrTypeName, async() =>
            {
                await WriteNullHandlingAsync(
                    writer, "obj", "list", type.IsNonNullType())
                .ConfigureAwait(false);
                await WriteDeserializeListAsync(
                    writer, "list", "i", "element",
                    clrElementTypeName, elementType.IsNonNullType(),
                    () => WriteAddElementAsync(
                        writer, clrElementTypeName, schemaTypeName,
                        "list", "i", "element", serializerMethod))
                .ConfigureAwait(false);
            }).ConfigureAwait(false);

            ;
        }
        private async Task WriteDeserializeMethodAsync(
            CodeWriter writer,
            IResultParserTypeDescriptor possibleType,
            ITypeLookup typeLookup,
            ISet <string> generatedMethods)
        {
            bool first = true;

            foreach (IType type in possibleType.ResultDescriptor.Fields
                     .Where(t => t.Type.NamedType().IsLeafType())
                     .Select(t => t.Type))
            {
                string methodName = SerializerNameUtils.CreateDeserializerName(type);

                if (generatedMethods.Add(methodName))
                {
                    Type   serializationType = typeLookup.GetSerializationType(type);
                    string serializerMethod  = _jsonMethod[serializationType];

                    if (!first)
                    {
                        await writer.WriteLineAsync().ConfigureAwait(false);
                    }
                    first = false;

                    if (type.IsListType() && type.ListType().ElementType.IsListType())
                    {
                        // TODO : implement this
                        throw new NotImplementedException();
                    }
                    else if (type.IsListType() &&
                             type.ListType().ElementType.IsLeafType())
                    {
                        await WriteDeserializeLeafListAsync(
                            writer,
                            typeLookup,
                            methodName,
                            type,
                            type.NamedType().Name,
                            serializerMethod)
                        .ConfigureAwait(false);
                    }
                    else
                    {
                        await WriteDeserializeLeafAsync(
                            writer,
                            methodName,
                            typeLookup.GetLeafClrTypeName(type),
                            type.NamedType().Name,
                            serializerMethod,
                            type.IsNonNullType())
                        .ConfigureAwait(false);
                    }
                }
            }
        }