public override void Process(IEnumerable <Assembly> input)
        {
            base.Process(input);

            Types = Types.OrderBy((arg) => arg.Type.FullName).OrderBy((arg) => Types.HasClass(arg.Type.BaseType)).ToList();
            Console.WriteLine($"\t{Types.Count} types found");

            // proceed with extra adjustments before giving results to the generator
            foreach (var t in Types)
            {
                foreach (var uctor in GetUnavailableParentCtors(t))
                {
                    var c = new ProcessedConstructor(uctor.Constructor, this)
                    {
                        Unavailable = true
                    };
                    t.Constructors.Add(c);
                }
            }

            // we want to create wrappers only if the signature does not already exists, e.g. both `.ctor ()` and `.ctor (int i = 0)` can co-exists in .net
            foreach (var dv in members_with_default_values)
            {
                var pt = GetProcessedType(dv.DeclaringType);
                var ci = dv as ConstructorInfo;
                if (ci != null)
                {
                    foreach (var pc in AddDefaultValuesWrappers(ci))
                    {
                        if (!pt.SignatureExists(pc))
                        {
                            pt.Constructors.Add(pc);
                        }
                        else
                        {
                            Delayed.Add(ErrorHelper.CreateWarning(1021, $"Constructor `{ci}` has default values for which no wrapper is generated."));
                        }
                    }
                    continue;
                }
                var mi = dv as MethodInfo;
                foreach (var pm in AddDefaultValuesWrappers(mi))
                {
                    if (!pt.SignatureExists(pm))
                    {
                        pt.Methods.Add(pm);
                    }
                    else
                    {
                        Delayed.Add(ErrorHelper.CreateWarning(1032, $"Method `{mi}` has default values for which no wrapper is generated."));
                    }
                }
            }

            ErrorHelper.Show(Delayed);
        }
        protected IEnumerable <ProcessedConstructor> PostProcessConstructors(IEnumerable <ConstructorInfo> constructors)
        {
            HashSet <string> duplicateNames = FindDuplicateNames(constructors);

            foreach (ConstructorInfo constructor in constructors)
            {
                ProcessedConstructor processedConstructor = new ProcessedConstructor(constructor, this);

                if (duplicateNames.Contains(CreateStringRep(constructor)))
                {
                    processedConstructor.FallBackToTypeName = true;
                }

                yield return(processedConstructor);
            }
        }
        IEnumerable <ProcessedConstructor> AddDefaultValuesWrappers(ConstructorInfo ci)
        {
            // parameters with default values must be at the end and there can be many of them
            var parameters = ci.GetParameters();

            for (int i = parameters.Length - 1; i >= 0; i--)
            {
                if (!parameters [i].HasDefaultValue)
                {
                    continue;
                }
                var pc = new ProcessedConstructor(ci, this)
                {
                    ConstructorType       = ConstructorType.DefaultValueWrapper,
                    FirstDefaultParameter = i,
                };
                yield return(pc);
            }
        }