internal static GenericTypeName?TryParse(string text)
        {
            if (text.IndexOf('[') is var index &&
                index > 0)
            {
                var metadataName = text.Substring(0, index);
                if (TryParseArity(metadataName, out var arity) &&
                    GenericTypeArgument.TryParseBracketedList(text, index, arity, out var typeArguments) &&
                    arity == typeArguments.Length)
                {
                    return(new GenericTypeName(metadataName, typeArguments));
                }
            }

            return(null);
        }
        public static bool TryParse(string text, out GenericTypeName genericTypeName)
        {
            if (text.IndexOf('[') is var index &&
                index > 0)
            {
                var metadataName = text.Substring(0, index);
                if (TryParseArity(metadataName, out var arity) &&
                    GenericTypeArgument.TryParseBracketedList(text, index, arity, out var typeArguments) &&
                    arity == typeArguments.Length)
                {
                    genericTypeName = new GenericTypeName(metadataName, typeArguments);
                    return(true);
                }
            }

            genericTypeName = default(GenericTypeName);
            return(false);
        }
        private static bool TryParse(string text, ref int pos, out GenericTypeArgument genericTypeArgument)
        {
            while (pos < text.Length &&
                   (text[pos] == ' ' || text[pos] == ','))
            {
                pos++;
            }

            if (text[pos] == '[' &&
                TryFindBracketedList(text, pos, out var bracketed))
            {
                var temp = 1;
                if (TryParse(bracketed, ref temp, out genericTypeArgument))
                {
                    pos += bracketed.Length;
                    while (pos < text.Length &&
                           text[pos] == ' ')
                    {
                        pos++;
                    }

                    return(true);
                }
            }
            else if (TryFindMetadataName(text, ref pos, out var metadataName, out var arity))
            {
                if (arity > 0 &&
                    TryFindBracketedList(text, pos, out var argsString) &&
                    TryParseBracketedList(argsString, 0, arity, out var args))
                {
                    genericTypeArgument = new GenericTypeArgument(metadataName, args);
                    pos += argsString.Length;
                    return(true);
                }

                genericTypeArgument = new GenericTypeArgument(metadataName, null);
                return(true);
            }

            pos = int.MaxValue;
            genericTypeArgument = default(GenericTypeArgument);
            return(false);
        }