/// <summary>
        /// Generates code for the specified type.
        /// </summary>
        /// <param name="type">The type.</param>
        /// <param name="options">The generator options.</param>
        /// <returns>System.String.</returns>
        public string Generate(Type type, TypeNameGeneratorOptions options)
        {
            var t      = type;        // store the unchanged type
            var suffix = "";
            var prefix = "";

start:
            var fn = t.FullName;             // possible null on generic types. "T", "T[]"
            var n = t.Name;

            if (n.EndsWith("]"))               // HasElementType==true

            // []   [,]
            // C#: string[][,] == Reflection Name = "String[,][]"
            {
                var match = Regex.Match(n, @"(\[,*\])$", RegexOptions.Compiled);
                suffix = suffix + match.Value;
                t      = t.GetElementType();
                goto start;
            }
            if (n.EndsWith("&"))               // HasElementType==true, IsByRef==true
            // T& => ref T, out T
            // the "out" is only known by ParameterInfo.IsOut
            {
                prefix += "ref ";
                t       = t.GetElementType();
                goto start;
            }

            if (t.IsGenericParameter)
            {
                // "T"
                fn = n;
            }
            else if (t.IsConstructedGenericType)
            {
                // "KsWare.CodeGenerator.Tests.SignatureHelperTests+IGenericInterface1`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"
                var sb   = new StringBuilder();
                var gt   = t.GetGenericTypeDefinition();
                var gtfn = gt.FullName.Substring(0, gt.FullName.IndexOf("`"));
                sb.Append(gtfn);
                sb.Append("<");
                sb.Append(Generator.Generate(t.GetGenericArguments()));
                sb.Append(">");
                fn = sb.ToString();
            }
            else if (t.IsGenericTypeDefinition)
            {
                // "KsWare.CodeGenerator.Tests.SignatureHelperTests+IGenericInterface1`1"
                var sb   = new StringBuilder();
                var gt   = t.GetGenericTypeDefinition();
                var gtfn = gt.FullName.Substring(0, gt.FullName.IndexOf("`"));
                sb.Append(gtfn);
                sb.Append("<");
                sb.Append(Generator.Generate(t.GetGenericArguments()));
                sb.Append(">");
                fn = sb.ToString();
            }

            if (fn == null)
            {
                Debugger.Break();
            }
            if (fn.Contains("`"))
            {
                Debugger.Break();
            }

            fn = fn.Replace("+", ".");

            switch (fn)
            {
            case "System.Void":    fn = "void";   break;

            case "System.UInt16":  fn = "ushort"; break;

            case "System.UInt32":  fn = "uint";       break;

            case "System.UInt64":  fn = "ulong";  break;

            case "System.Int16":   fn = "short";  break;

            case "System.Int32":   fn = "int";        break;

            case "System.Int64":   fn = "long";       break;

            case "System.Char":    fn = "char";       break;

            case "System.String":  fn = "string"; break;

            case "System.Boolean": fn = "bool";       break;

            case "System.Byte":    fn = "byte";       break;

            case "System.SByte":   fn = "sbyte";  break;

            case "System.Double":  fn = "double"; break;

            case "System.Single":  fn = "float";  break;

            case "System.Decimal": fn = "decimal"; break;
            }
//			if (fn.StartsWith("System.")) return fn.Substring(7);
            return(prefix + fn + suffix);
        }
 /// <summary>
 /// Generates code for the specified type.
 /// </summary>
 /// <param name="type">The type.</param>
 /// <returns>System.String.</returns>
 public string Generate(Type type) => Generate(type, TypeNameGeneratorOptions.Create(GeneratorMode));